Pic Seriporttan gelen string ifadeleri okumuyor!

Başlatan Lenin, 22 Ekim 2017, 12:18:39

Lenin

Merhabalar. C# ile seriport uygulaması yapıyorum. C#'dan yolladığım string verileri pic almıyor. RDA kesmesine dahi gitmiyor. Sorun ne olabilir?

vitruvius

Donanim ve yazilim bilgilerini paylasmadan yorum yapmak zor.

Lenin

#include <seriport.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <input.c>

#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>

unsigned long int bilgi=0;
float volt1=0,volt2=0;
unsigned int zaman=0;
char gelen[10]="\0";

#INT_RTCC
void  RTCC_isr(void) 
{
   zaman++;
   if(zaman>100)
   {
      zaman=0;
      printf("%07.2f#%07.2f\n\r",volt1,volt2);
      printf(lcd_putc,"\f%s",gelen);
   }
}

#INT_RDA
void  RDA_isr(void) 
{
   get_string(gelen,10);
   output_toggle(pin_d0);
   printf(lcd_putc,"\f%s",gelen);
   disable_interrupts(INT_RDA);
}

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_DIV_64);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT);      //1,6 ms overflow


   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   output_d(0x00);

   lcd_init();

   while(TRUE)
   {
      enable_interrupts(INT_RDA);
      set_adc_channel(0);
      delay_us(20);
      bilgi=read_adc();
      volt1=(0.0048828125*bilgi)*1000;
      set_adc_channel(1);
      delay_us(20);
      bilgi=read_adc();
      volt2=(0.0048828125*bilgi)*1000;
   }

}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace veriayirmadeneme
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            label3.Text = trackBar2.Value.ToString();
            label2.Text = trackBar1.Value.ToString();
            label1.Text = "Bağlantı Yok";
            string[] portlar = SerialPort.GetPortNames();

            foreach (string ports in portlar)
            {
                comboBox1.Items.Add(ports);
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.Text.ToString();
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen==false)
            {
                try
                {
                    serialPort1.Open();
                    label1.Text = "Bağlandı";
                    serialPort1.DiscardInBuffer();
                    serialPort1.DiscardOutBuffer();
                }
                catch (Exception)
                {
                    MessageBox.Show("Bağlantı Hatası");
                    serialPort1.Close();
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen==true)
            {
                try
                {
                    serialPort1.DiscardInBuffer();
                    serialPort1.DiscardOutBuffer();
                    serialPort1.Close();
                    label1.Text = "Bağlantı Kesildi";
                }
                catch (Exception)
                {
                    MessageBox.Show("Bağlantı Hatası");
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.WriteLine(trackBar1.Value.ToString() + "," + trackBar2.Value.ToString()+"\r");
            serialPort1.DiscardOutBuffer();
            serialPort1.DiscardInBuffer();
            label4.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label2.Text = trackBar1.Value.ToString();
        }

        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            label3.Text = trackBar2.Value.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            serialPort1.WriteLine(textBox1.Text.ToString()+"\n\r");
            serialPort1.DiscardInBuffer();
            serialPort1.DiscardOutBuffer();
        }

        string gelen;
        string[] veri;
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                gelen = serialPort1.ReadLine();
                veri = gelen.Split('#');
                label5.Text = veri[0].ToString();
                label6.Text = veri[1].ToString();
                serialPort1.DiscardInBuffer();
                serialPort1.DiscardOutBuffer();
            }
            catch (Exception)
            {

            }
        }
    }
}


RDA kesmesine gidiyor ama pic donuyor bu sefer. Reset tuşuna basınca kendine geliyor

aliveli

get_string(gelen,10); burada sıkıntı var demekki
bilgisayardan 10 karakter geleceği garantimi?


programda RTCC gereksiz gözüküyor, main de halledebilirsin illa kullanacaksan RDA içine girince kapatman gerekir


örneklerdeki Ex_Sisr.c incele

Lenin

Tamamdır sorun hal oldu. C# daki serialport1.WriteLine yerine serialport1.write yazınca pic donmuyor artık.

fide

Bence c# kısmındaki writeln kalsın, getsitringi gets(değişken) yada değişken=fgets( stream) olarak değiştir. Herzaman 10 karakter göndermeyebilirsin. Ama gönderdiğin ifade içinde bir tane entere (ascii 13, /r yada writelineın yazdığı enter) varsa program entere odaklı çalışır. String boyutuna bakmaz.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com