Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual C# => Konuyu başlatan: cebeci52 - 06 Eylül 2014, 17:48:32

Başlık: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 17:48:32
arkadaşlar ölçtüğüm gerilim bilgisini seri porttan sürekli okuyup textbox yada listbox a yazdırmak istiyorum. Bir türlü okuyamadım yardımcı olur musunuz?

kodlar şu şekilde C# tarafı

  private void Form1_Load(object sender, EventArgs e)
        {

            string[] portlar = SerialPort.GetPortNames();  // portları dizi halinde aldık

            foreach (string port in portlar)
            {

                comboBox1.Items.Add(port.ToString()); // Portlarımızı combobox ın içine aldık.

            }

            CheckForIllegalCrossThreadCalls = false;
           
            this.WindowState = FormWindowState.Maximized;
                     
                                 
        }

private void buttonStart_Click(object sender, EventArgs e)
        {

            if (serialPort1.IsOpen) // Bağlantıyı açıyoruz.eğer önceden bağlan butonuna basmış isek yani bağlantıyı açmışsak aşağıdaki hata mesajını verecektir.
            {

                MessageBox.Show("Port Açık Bulunmaktadır..", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);

                return;

            }

            else
            {

                try
                {

                    serialPort1.BaudRate = int.Parse("9600"); // Hız olarak 9600 verdik.

                    serialPort1.DataBits = int.Parse("8"); // Veri bit ini de 8 bit olarak verdik

                    serialPort1.StopBits = System.IO.Ports.StopBits.One; // Durma bitini tek sefer olarak verdik.

                    serialPort1.Parity = Parity.None; // eşlik bit ini vermedik.

                    serialPort1.PortName = comboBox1.Text; // Port adlarını comboboxtan alıyoruz.

                    serialPort1.Open(); // Bağlantıyı açıyoruz

                    MessageBox.Show("Bağlantı Başarılı");

                }

                catch (Exception) // Herhangi bir hata anında alttaki hata mesajını alacağız..
                {

                    MessageBox.Show("cihazınız bağlı değil...", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);

                }

            }
      }

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

           byte[] buffer;

            buffer = new byte[1];

            serialPort1.Read(buffer, 0, 0);

            string veri = serialPort1.ReadExisting();
           
            textBox1.Text = veri;
                   
                     
        }
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: barisertekin - 06 Eylül 2014, 18:31:50
https://www.picproje.org/index.php/topic,53274.0.html (https://www.picproje.org/index.php/topic,53274.0.html)

https://www.picproje.org/index.php/topic,51520.0.html (https://www.picproje.org/index.php/topic,51520.0.html)

Bu linkleri bir inceleyin genellikle aynı sorun oluyor. Olmadı yine bakalım.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 21:34:36
üstat inceledim onları aynı bişey değişmedi veriyi bozuk okuyor yada ????(soru işareti) şeklinde okuyor.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 21:43:13
Eger veri hex olarak geliyorsa 127 ye kadar dogru okur. Uzeri degerleri ise size sacmaliyor gibi gelir. Ama gercekte dogru okuma yapar.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: Gökhan BEKEN - 06 Eylül 2014, 21:47:11
Gelen her veride kesmeye girdiğinden emin misiniz?
c# ile kesme neden çalışmaz? Cevabı burda:
(http://s22.postimg.cc/8hsew9o9t/csharp_kesme_sorunu.png)

Eğer kesmeye girdiği halde bozuk geliyorsa baudrate ayarını kontrol edin.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 21:49:46
üstat veri listbox a aldıgımda şu şekilde gözküküyor


(http://s29.postimg.cc/bx3eg81yb/aa1.jpg) (http://postimg.cc/image/bx3eg81yb/)

kesme derken nasıl anlamadım.


mesaj birleştirme:: 06 Eylül 2014, 21:52:58

kodlarımı şu şekilde düzelttim yine de aynı

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;
              //  timer1.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)
        {

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


        textbox yada list box a düzgün gelmiyor veri.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: Gökhan BEKEN - 06 Eylül 2014, 22:05:25
MCU nasıl gönderiyor veriyi?

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

Seriport terminal programlarından birisi ile denediniz mi? Terminale baktığınızda düzgün görebiliyor musunuz?
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 22:14:19
Eger o veriler dogru ise sizin son bytelik veri gecikiyor. O yuzden veriyi dogru aliyorsunuz ama yanlis satirda goruyorsunuz. Eger veriyi siz gonderiyosaniz veriyi gonderdikten sonra kucuk bir delay ekleyin. C# ta hqrhangi bir sorun yasamazsiniz.
Verinizin sonuna \r eklemeyi unutmayin
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 22:15:46
(http://s28.postimg.cc/w2cb4vhjd/Ads_z.jpg) (http://postimg.cc/image/w2cb4vhjd/)

terminale düzgün geliyor bozulma yok C# da textbox yada list box a alınca bozuk gösteriyo sebebini anlamadım. sorun mikrodenetleyici tarafında olmasa gerek..


Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 22:16:45
Sonuna \r ekleyin
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 22:16:58
Sonuna \r ekleyin
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 22:18:01
üstat nerenin sonuna anlamadım

mikrodenetleyici kodlarım şu şekilde

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=volt;
    UART3_Write_Text(txt);

  }
  void usb_kesme()
  {
   // kk=UART3_Read();
   // if(kk=='v')
    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();

   
   }

mesaj birleştirme:: 06 Eylül 2014, 22:26:20


(http://s29.postimg.cc/j68flgiqr/Ads_z.jpg) (http://postimg.cc/image/j68flgiqr/)


mikrodenetleyici tarafına delay_ms(100); ekledim veri üstteki  gibi C# a bozuk geliyor

/r dedigini nereye ekleyecem
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 22:35:06
void usb_yaz()
  {
    char i=0;
    for(i=0;i<8;i++)
    txt=volt;

txt[8]=0x0d;


    UART3_Write_Text(txt);
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 22:44:34
orası tam olarak şu şekilde yapıştırınca çıkmamış burda nereye eklemem gerekiyor.


(http://s15.postimg.cc/x1i2rdf07/Ads_z.jpg) (http://postimg.cc/image/x1i2rdf07/)
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: 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);
}

Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 22:55:08

(http://s8.postimg.cc/bc9l0johd/Ads_z.jpg) (http://postimg.cc/image/bc9l0johd/)


ekledim yine aynı veriler bozukk geliyo..
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 23:03:17
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
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 23:08:09

(http://s7.postimg.cc/dteczu8pz/Ads_z.jpg) (http://postimg.cc/image/dteczu8pz/)

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
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 23:19:13
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
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 23:26:53

(http://s16.postimg.cc/i1shbthhd/Ads_z.jpg) (http://postimg.cc/image/i1shbthhd/)

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);
         }
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 06 Eylül 2014, 23:41:08
    if (line[line.Length - 1] == (char)0x0d)
olarak birdeğiştirin hatalı \r nin karşılığı 0x0d desimal 20 benim hatam
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 06 Eylül 2014, 23:48:28

(http://s4.postimg.cc/twgp5ycsp/Ads_z.jpg) (http://postimg.cc/image/twgp5ycsp/)

  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
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: Kabil ATICI - 06 Eylül 2014, 23:56:11
Ş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.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 07 Eylül 2014, 00:02:20
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.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 00:05:16
ambar7  kardeş dediğini yaptım sonuç aynı bozuk geliyor..


(http://s4.postimg.cc/gmft95555/Ads_z.jpg) (http://postimg.cc/image/gmft95555/)



(http://s10.postimg.cc/pcqvp3wed/Ads_z2.jpg) (http://postimg.cc/image/pcqvp3wed/)

kodlar şu şekilde mikrodenetleyici tarafı


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

omereliusuk yine değişmedi


(http://s29.postimg.cc/saq8ip0pv/Ads_z.jpg) (http://postimg.cc/image/saq8ip0pv/)


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

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

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


(http://s29.postimg.cc/6xhzj2tpf/Ads_z.jpg) (http://postimg.cc/image/6xhzj2tpf/)


terminale düzgün geliyor veri C# a gelince bozuluyor sorun nerde onu anlamadım...
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 07 Eylül 2014, 00:29:15
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 :)
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 00:36:13

(http://s10.postimg.cc/mznn62k05/image.jpg) (http://postimg.cc/image/mznn62k05/)



(http://s18.postimg.cc/klvxbg51x/image.jpg) (http://postimg.cc/image/klvxbg51x/)

bu şekilde oldu şimdi de




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


mikrodenetleyici kodları verdiğini yazdım

(http://s29.postimg.cc/7kdogzg0z/image.jpg) (http://postimg.cc/image/7kdogzg0z/)
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 07 Eylül 2014, 00:40:17
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);

}
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: Gökhan BEKEN - 07 Eylül 2014, 00:44:51
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();
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 00:48:11

(http://s28.postimg.cc/ay40v4ozt/Ads_z.jpg) (http://postimg.cc/image/ay40v4ozt/)



(http://s21.postimg.cc/8d6wclv8z/image.jpg) (http://postimg.cc/image/8d6wclv8z/)

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


(http://s2.postimg.cc/hlhsftl3p/image.jpg) (http://postimg.cc/image/hlhsftl3p/)

readline da yaptım hata verdiiii
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: Gökhan BEKEN - 07 Eylül 2014, 01:03:01
Çalışma zamanında aldığınız bir hata değil mi?
Tam hatırlamıyorum verinin sonuna sadece \r  değilde  \r\n  ekleyerek deneyin.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 07 Eylül 2014, 02:14:39
 serial port read existing bölümüne
   int a = 0x00001000;
            while (Convert.ToBoolean(a--)) ;//tüm verini gelmesini bekliyoruz.
           veri = serialPort1.ReadExisting();
if (veri[veri.Length - 1] == (char)0x0d)

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


verici bölümüne
void usb_yaz()
  {
    char i=0;
txt[0]=0x20;
txt[1]=0x20;
    for(i=2;i<10;i++)    txt=volt[(i-2)];

txt[10]=0x0d;

    UART3_Write_Text(txt);

}
tamam olması gerekiyor. tabi yatmadıysan.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: barisertekin - 07 Eylül 2014, 11:18:23
Veriyi tam olarak almak istiyorsak ReadExisting(); değil ReadLine() kullanmalısınız. Verinin sonunada \n  koymalısınız.

ReadLine() : SerialPort sınıfının ReadLine isimli fonksiyonu seri portdan NewLine (\n) karakteri gelene kadar tanımladığınız ReadTimeout süresince bekler. Gelen veriyi size string türünden geri döndürür.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 13:17:50
omereliusuk dediğini yapınca donuyor program


(http://s29.postimg.cc/587nnhsyb/Ads_z.jpg) (http://postimg.cc/image/587nnhsyb/)




mesaj birleştirme:: 08 Eylül 2014, 03:18:25

bu verinin sonuna \n nasıl koyacazzz



mesaj birleştirme:: 08 Eylül 2014, 03:22:24


(http://s29.postimg.cc/nlm13a7kj/Ads_z.jpg) (http://postimg.cc/image/nlm13a7kj/)


sorunu çözemedimm


mesaj birleştirme:: 07 Eylül 2014, 13:41:07

Arkadaşlar kendi verimi geçtim 4 harf gönderiyorum onu dahi sıralı almıyor gönderdiğim veriler

mikrodenetleyici tarafı

void usb_yaz()
  {
   
    txt[0]='a';
    txt[1]='b';
    txt[2]='c';
    txt[3]='d';

    UART3_Write_Text(txt);
  }
C# a gelince gözüken ise

(http://s30.postimg.cc/usjms2er1/Ads_z.jpg) (http://postimg.cc/image/usjms2er1/)

bu şekilde bozuk alıyor.

C# veri alma kodu

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


            string line = serialPort1.ReadExisting();
       
              textBox1.Text = line;
              listBox1.Items.Add(line);
        }
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: ctn1905 - 07 Eylül 2014, 13:40:25
pic' den data yollarken datanın sonuna 13 ekle yani putc(13);  yaz alınan verilerin sonuna otomatik enter koymuş olursun böylece. c# tarafında da serialPort1.readTo("\n");  komutu kullan data alırken.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 07 Eylül 2014, 13:56:12
   int a = 0x00001000; while (Convert.ToBoolean(a--)) ;                     //tüm verini gelmesini bekliyoruz.
           veri = serialPort1.ReadExisting();
veya
readLine
ne yazarsan yaz
beklemeyi yap çalışması gerekiyor.
yıllar önce yaptığım yazılımda mecbur kalmasam bekleme koymazdım herhalde ki koymuşum.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 15:41:15
ctn1905 pic değil arm kullanıyorummm

dediklerini yaptım readTo("\n") okuma yapmıyorr.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 15:56:17
C# tarafına



void oku()
        {

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

       
        }

       
           

        public void serialPort1_DataRecived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
       
            Thread paralel1 = new Thread(new ThreadStart(oku));
            paralel1.Start();
            paralel1.Join();
               
        }


kodunu yaz ve form1_Load bölümüne de

        CheckForIllegalCrossThreadCalls = false; 

satırını ekle

pic kısmında veriyi gönderirken, gönderdiğin dizinin son elemanına 0x0d (\n) karakterinin yaz. 0x0d =\n karakteri değilse data okuyamazsın (\n karakteri olması lazım)

Mesela gönderdiğin data üç elaman içeriyor a,b,c

txt[0]='a';
txt[1]='b';
txt[2]='c';

txt[3]='\n'; olması lazım.

txt[3]='\n';  satırı hata verirse txt[3]= 0x0d; ile değiştir.



Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 15:57:59
fthsev bunu da deneyecem şimdii denemediğim kod kalmadıı zatenn
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 16:01:50
Alıntı yapılan: cebeci52 - 07 Eylül 2014, 15:57:59
fthsev bunu da deneyecem şimdii denemediğim kod kalmadıı zatenn

Herhangi bir hata alırsanız

line=string.empty;  satırını kaldırınız
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 16:05:01

(http://s29.postimg.cc/3vbcopihf/Ads_z.jpg) (http://postimg.cc/image/3vbcopihf/)

thread ne diyor burda
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 16:07:23
using System.Threading;

satırını kodun başına ekle
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 16:11:37
ekledim hata verdi yine çalışıyor donuyor sonra


(http://s16.postimg.cc/wbw10aeoh/Ads_z.jpg) (http://postimg.cc/image/wbw10aeoh/)

(http://s16.postimg.cc/eacw2hknl/Ads_z1.jpg) (http://postimg.cc/image/eacw2hknl/)
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 16:13:22
Alıntı yapılan: cebeci52 - 07 Eylül 2014, 16:11:37
ekledim hata verdi yine çalışıyor donuyor sonra


(http://s16.postimg.cc/wbw10aeoh/Ads_z.jpg) (http://postimg.cc/image/wbw10aeoh/)

(http://s16.postimg.cc/eacw2hknl/Ads_z1.jpg) (http://postimg.cc/image/eacw2hknl/)


Bğalantı noktası kapalı serialPort1.Open();  satırını çalıştırdığından emin misin?

Bağalntıyı yaptın mı?

mesaj birleştirme:: 07 Eylül 2014, 16:17:10

Kodun tamamını kod yükleme seçeneği ile yüklermisin?

Mesaj yazarken yukarıdaki ifadelerin üzerinde # karakteri ona basınca kod ekleyebilirsin.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 16:20:32
C# kodları

  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 Form1_Load(object sender, EventArgs e)
        {

           
            comboBox1.DataSource = SerialPort.GetPortNames();
                   
            CheckForIllegalCrossThreadCalls = false;
             
        }

  void oku()
        {
            string line;
            line = serialPort1.ReadLine();
            textBox1.Text = line;
            listBox1.Items.Add(line);
         // 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();
         
        }


(http://s8.postimg.cc/6t7q6m48x/image.jpg) (http://postimg.cc/image/6t7q6m48x/)

(http://s8.postimg.cc/i4aduzb41/image.jpg) (http://postimg.cc/image/i4aduzb41/)


mesaj birleştirme:: 07 Eylül 2014, 16:24:07

C# kodları

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 Form1_Load(object sender, EventArgs e)
        {

           
            comboBox1.DataSource = SerialPort.GetPortNames();
                   
            CheckForIllegalCrossThreadCalls = false;
             
        }

  void oku()
        {
            string line;
            line = serialPort1.ReadLine();
            textBox1.Text = line;
            listBox1.Items.Add(line);
         // 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();
         
        }

Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 16:32:30
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 { }

        }
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 07 Eylül 2014, 16:37:09
(http://s22.postimg.cc/46swcs8i5/Ads_z.jpg) (http://postimg.cc/image/46swcs8i5/)


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ı

(http://s22.postimg.cc/ud2zhnzf1/Ads_z.jpg) (http://postimg.cc/image/ud2zhnzf1/)
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 07 Eylül 2014, 16:51:26
Ş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.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 08 Eylül 2014, 11:49:47
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.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: omereliusuk - 08 Eylül 2014, 21:11:23
İyi de bunu cok onceleri yazmistik. ^-^
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: fthsev - 08 Eylül 2014, 21:24:47
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.
Başlık: Ynt: seri porttan gerçek zamanlı veri okuma yardım.
Gönderen: cebeci52 - 10 Eylül 2014, 20:51:43
sorun şu an için çözüldü ilgilenen arkadaşlara teşekkür ederim...