seri porttan gerçek zamanlı veri okuma yardım.

Başlatan cebeci52, 06 Eylül 2014, 17:48:32

fthsev

void oku()  kısmını şu şekilde değiştirip son bir kez dener misin?

void oku()
        {
            string line;
           try
          {
            line = serialPort1.ReadLine();
            textBox1.Text = line;
            listBox1.Items.Add(line);
          }
         catch{}
         // line = string.Empty;
            try
            {
                serialPort1.DiscardInBuffer();
                serialPort1.DiscardOutBuffer();
            }
            catch { }

        }

cebeci52

#46



aynı


mesaj birleştirme:: 08 Eylül 2014, 06:46:22

Arkadaşlar amacım mikrodenetleyicide(arm) ölçtüğüm gerilim degerini C#  da seri port(ft232) kullanarak textbox ve listbox da göstermek basit seri port baglantısı yapmak istiyorum ama veriler bozularak geliyor tüm kullandıgım kodları ve ekran görüntülerini atıyorum.
C# cılar, arm programcılar yardımlarınızı bekliyorum...

Mikrodenetleyici kodları
sbit LCD_RS at GPIOE_ODR.B8;
sbit LCD_EN at GPIOE_ODR.B10;
sbit LCD_D4 at GPIOE_ODR.B4;
sbit LCD_D5 at GPIOE_ODR.B5;
sbit LCD_D6 at GPIOE_ODR.B6;
sbit LCD_D7 at GPIOE_ODR.B7;

int sayi=0,mV=0;
char txt[64],volt[64],kk;
char gelen,i=0;

int ADC_Olcum(char kanal)
{
 unsigned long temp=0;
 char k=0;
 for (k=0;k<128;k++)
 {
  temp+=ADC1_Get_Sample(kanal);
 }
 return temp>>7;
 }
 
 void LCD_Yaz(int okunan_deger)
 {
 mV=okunan_deger*0.7130;
 if(mV>=10000)
  volt[0]=(mV/10000)+48;
  else  volt[0]=' ';
  volt[1]=(mV%10000)/1000+48;
  volt[2]='.';
  volt[3]=(mV%1000)/100+48;
  volt[4]=(mV%1000)%100/10+48;
  volt[5]=(mV%1000)%100%10+48;

  Lcd_Out(2,1,volt);
  Lcd_Out(2,8,"V");


  }
  void usb_yaz()
  {
  
     char i=0;
    for(i=0;i<8;i++)
    txt[i]=volt[i];
    UART3_Write_Text(txt);
  }
  void usb_kesme()
  {
  
    usb_yaz();
  }
  
   void main()
   {
   GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
   GPIOE_ODR.B9=0;
   
   UART3_Init_Advanced(9600,_UART_8_BIT_DATA, _UART_NOPARITY,_UART_ONE_STOPBIT, & _GPIO_MODULE_USART3_PD89);
   
   Lcd_init();
   ADC1_init();
   ADC_Set_Input_Channel(_ADC_CHANNEL_1);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Out(1,1,"Voltmetre");
   while(1)
   {

   sayi=ADC_Olcum(1);
   LCD_Yaz(sayi);
   usb_kesme();

   }

   }


C# kodları
private void Form1_Load(object sender, EventArgs e)
        {

             comboBox1.DataSource = SerialPort.GetPortNames();
             CheckForIllegalCrossThreadCalls = false;
               
        }
private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.SelectedItem.ToString();
            serialPort1.BaudRate = 9600;

            serialPort1.Open();
          
            serialPort1.DataReceived += serialPort1_DataReceived;
          
            
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                             
            }
}
  void oku()
        {
           
            string line;
            try
            {
                line = serialPort1.ReadLine();
                textBox1.Text = line;
                listBox1.Items.Add(line);
            }
            catch { }
         //    line = string.Empty;
            try
            {
                serialPort1.DiscardInBuffer();
                serialPort1.DiscardOutBuffer();
            }
            catch { }



        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {


            Thread paralel1 = new Thread(new ThreadStart(oku));
            paralel1.Start();
            paralel1.Join();
         

        }


C# ekran çıktısı



fthsev

Şu an için aklıma gelen başka bir şey yok kusura bakma. Bu kodu bu şekliyle daha önce kullanmıştım bir sorun olmamıştı. Datayı işlemciden gönderirken bekleme süresi veriyor musun? Eğer verdiysen süreyi biraz artır.

fthsev

#48
Evet sorunu çözdüm ve denedim. Bekleme süresi vermek gerekiyor. o zaman düzgün gidiyor veriler. İşlemci kısmında her bir gönderimden sonra

diğer veriyi göndermeden bir bekleme süresi verin. Süre değişkenlik gösrerebilir. Örnek olarak benim haberleşme hızım "38400" bekleme süresi olarak

5 ms verdim. Veriler düzgün bir şekilde iletildi.

omereliusuk


fthsev

Alıntı yapılan: omereliusuk - 08 Eylül 2014, 21:11:23
İyi de bunu cok onceleri yazmistik. ^-^

:) Bunu benim yazdığım koda istinaden söyledim. Bekleme süresi ver demeyi unutmuştum.

cebeci52

sorun şu an için çözüldü ilgilenen arkadaşlara teşekkür ederim...