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

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

cebeci52


omereliusuk

#16
Alıntı yapılan: omereliusuk - 06 Eylül 2014, 22:49:22
void usb_yaz()
  {
    char i=0;
    for(i=0;i<8;i++)
    txt=volt;

txt[8]=0x0d;


    UART3_Write_Text(txt);
Delay ekleyin
}
Bir daha deneyin en son veriyi denetleyici gonderinceye kadar beklsin bakalim 10ms 20ms yeter.
Hatta \r den sonra bosluk da ekleyebilirsiniz

cebeci52

#17



delay_ms(20);

ekledim yine aynı.


mesaj birleştirme:: 06 Eylül 2014, 23:09:35

Hatta \r den sonra bosluk da ekleyebilirsiniz demişsin.   \r dediğin kesmemi anlayamadım boşluğu nereye ekleyecem

omereliusuk

C#tarafinda en son gelen verinin degerine bakin eger son verinin deheri \r yani hexKarsiligi 0x20 ise text boxta gostersin.
if(Veri[veri.lenggt-1]==(char)0x20)textbox.text=veri
Gibi bir kod yazmalisiniz

cebeci52




kodları dediğin gibi düzelttim text box a hiç veri gelmedi listbox da göründüğü gibi

   private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
         
           string line = serialPort1.ReadExisting();
           this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
           
        }

        private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {

     
           if (line[line.Length - 1] == (char)0x20)

               textBox1.Text = line;
               listBox1.Items.Add(line);
         }

omereliusuk

    if (line[line.Length - 1] == (char)0x0d)
olarak birdeğiştirin hatalı \r nin karşılığı 0x0d desimal 20 benim hatam

cebeci52




  private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
                       
          string line = serialPort1.ReadExisting();
          this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
           

        }

        private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {

       

           if (line[line.Length - 1] == (char)0x0d)
               textBox1.Text = line;
               listBox1.Items.Add(line);

      }

basit bi yerde hata var ama nerde çözemedim seni de ugraştırdım.. veri bozuk yine

Kabil ATICI

Şimdi aklını karıştırmadan ;
serialPort1.ReadExisting();
bu satır seri port tamponda ne varsa alır. Onun için gelen verinin işaretlemen gerekir.
Yani verini
'a'+veri+'b'
şeklinde gönderirsen, bunu gelen veri içinde ayıklayabilirsin. Sonuçta verin string olarak geliyor ('0','1',...'8','9'','.') Yani gelen veri içinde 0x00 şeklinde bir şey gelmemesi gerekir.
Bu durumda serialPort1.ReadExisting();  okuması yaptığın zaman kaç tane karakter olduğunu kontrol et.
Yukarıdaki gibi bir şekilde gelirse gelen veri içinde 'a' karakterini tespit et ve 'b' karakterine kadar birleştir ve bunu veri olarak yaz.

işlemciden nasıl göndereceğin veya nereye ne koyacağın için anladığım kadarı ile usb ile veri gönderiyorsun. Bunun için bu konu ile ilgili yere bak. Hatta ilk etapta ölçeceğin değer yerine senin belirlediğin bir değeri gönder. BÖylece kontrol etme şansın olur.

    char i=0;
    for(i=0;i<8;i++)
    txt=volt;--//--------->Bu satırın normalde   txt=volt; şeklinde olmasını beklerdim.(belki derleyici farkından)
    UART3_Write_Text(txt);


bu satırları basitçe
txt[0]='b';
txt[1]='1';
txt[2]='2';
txt[3]='3';
txt[4]='4';
txt[5]='5';
txt[6]='a';
UART3_Write_Text(txt);
şeklinde  program gönderip verinin düzgün bir şekilde alınmasını sağlamaya çalışırım.
Yanlış anlamadıysam bilgisayar tarafına "a54321b" şeklinde gelmesi gerekir. Buradan a ve b'yi ayıklarsam geriye istenilen veri kalır.
ambar7

omereliusuk

yok veri artık düzgün geliyor. şöyle yapalım.
0x0d yerine sen farklı bir şey yaz. mesela 0x03 yaz
veya hiç kullanmayacağın bir harf deolabilir.
hepsini o şekilde değiştir.
olan şu.
c# evente geldiği zaman bazen \r komutunu görüyor. bazen görmüyor.
gördüğü zaman yeni satıra geçiyor bir de kendisi yeniden satıra geçiyor. iki satır birden atlıyor. o yüzden veri bazen satır atlayarak geliyor.

cebeci52

#24
ambar7  kardeş dediğini yaptım sonuç aynı bozuk geliyor..








kodlar şu şekilde mikrodenetleyici tarafı


mesaj birleştirme:: 07 Eylül 2014, 14:08:51

omereliusuk yine değişmedi





if (line[line.Length - 1] == (char)0x03)

               textBox1.Text = line;
               listBox1.Items.Add(line);

mesaj birleştirme:: 07 Eylül 2014, 00:11:35





terminale düzgün geliyor veri C# a gelince bozuluyor sorun nerde onu anlamadım...

omereliusuk

void usb_yaz()
  {
    char i=0;
 txt[0]=0x20;
 txt[1]=0x20;
    for(i=2;i<10;i++)    txt[i]=volt[i];

 txt[10]=0x03;
  txt[11]=0x20;
 txt[12]=0x20;
    UART3_Write_Text(txt);

}


bir de böyle deneyin iş inada bindi :)

cebeci52

#26







bu şekilde oldu şimdi de




mesaj birleştirme:: 07 Eylül 2014, 00:38:33


mikrodenetleyici kodları verdiğini yazdım



omereliusuk

void usb_yaz()
  {
    char i=0;
txt[0]=0x20;
txt[1]=0x20;
    for(i=2;i<10;i++)    txt=volt[(i-2)];

txt[10]=0x03;
  txt[11]=0x20;
txt[12]=0x20;
    UART3_Write_Text(txt);

}

Gökhan BEKEN

Veriyi neden string line = serialPort1.ReadExisting(); şeklinde alıyorsunuz
Bu yöntem \r karakterine göre okuma yapıyor, ben bunu kullanıyorum:
line = serialPort1.ReadLine();
Özel mesaj okumuyorum, lütfen göndermeyin.

cebeci52

#29







C# kodlarım

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;
                             
            }

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
           
             
          string line = serialPort1.ReadExisting();
          this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
         

        }
private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {

          //  if (line[line.Length - 1] == (char)0x03)
               textBox1.Text = line;
               listBox1.Items.Add(line);
        }


sorunu çözemedim nerdeee

mesaj birleştirme:: 07 Eylül 2014, 00:51:27




readline da yaptım hata verdiiii