C# Seri Port Okuma

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Her saniye yeni bir değer geliyor arduinodan, arduino ide sorunsuz gösteriyor bu değerleri ama c# ile yazmaya çalıştığım uygulamada sıkıntı var; mesela değer 26 geliyor arduino serial monitorde ama benim uygulamada 2 yazıyor, bir süre daha doğru yazıp sonra 6 yazıyor falan.

    Nerde yanlış yapıyorum acaba:

    serialport baud değeri 57600 ayarlı.

    this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.DataReceivedHandler);

    şeklinde veri geldiğinde okuma yapmasını sağladım, her veri geldiğinde DataReceivedHandler fonksiyonu çalışıyo ve fonksiyon içinde

    string gelen = serialPort1.ReadExisting(); bulunan veriyi okutup daha sonra serialPort1.DiscardInBuffer(); bufferı temizliyorum.


    :)
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erc
    erc's avatar
    Kayıt Tarihi: 23/Aralık/2010
    Erkek

    " serialPort.BaudRate = 5760"

    denediniz mi hocam portu açmadan önce ?

     

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    erc bunu yazdı

    " serialPort.BaudRate = 5760"

    denediniz mi hocam portu açmadan önce ?

     

    Properties kısmında ayarlı, zaten baud değeri farklı olsa anlamsız veriler yazdırır, benim sıkıntım bufferla alakalı diye düşünüyorum ama bulamıyorum işte iyi bilmediğim için.


    :)
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erc
    erc's avatar
    Kayıt Tarihi: 23/Aralık/2010
    Erkek

    arduniodan veriyi kaç bit gönderiyorsun bir de tipi ne ?

     

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    printf("%d",degisken); şeklinde int gönderiyorum. 32 bitlik veri int tipinde rf ile aktarılıyor, bu veriyi rfden okuyup 2 arduino arasında aktarıyorum, aldığım veriyi serial monitorde düzgün görüntüleyebiliyorum ide üzerinde, c#ta da ilk mesajda yazdığım gibi timerla değilde veri geldiği zaman okuma yap diyerek almaya çalışıyorum ama arada hatalı değerler çıkıyor işte.


    :)
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erc
    erc's avatar
    Kayıt Tarihi: 23/Aralık/2010
    Erkek
    wasd bunu yazdı

    printf("%d",degisken); şeklinde int gönderiyorum. 32 bitlik veri int tipinde rf ile aktarılıyor, bu veriyi rfden okuyup 2 arduino arasında aktarıyorum, aldığım veriyi serial monitorde düzgün görüntüleyebiliyorum ide üzerinde, c#ta da ilk mesajda yazdığım gibi timerla değilde veri geldiği zaman okuma yap diyerek almaya çalışıyorum ama arada hatalı değerler çıkıyor işte.

    timerla yemez hocam.

    ilk etap.

                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    serialPort.Open(); 

    Porttan gelen verileri alıp yazdırmada şöyle;

           void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string data = serialPort.ReadExisting();
                richTextBox1.AppendText(data.ToString());
            }

    Şunlarla yaptığımda timer'a gerek kalmadan 1 milisaniyeyle verileri 3 digit halinde çekebiliyorum. 16 bitlik veri gönderiyorum ben..

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    1234567B
    1234567B's avatar
    Kayıt Tarihi: 04/Şubat/2010
    Erkek
    erc bunu yazdı
    wasd bunu yazdı

    printf("%d",degisken); şeklinde int gönderiyorum. 32 bitlik veri int tipinde rf ile aktarılıyor, bu veriyi rfden okuyup 2 arduino arasında aktarıyorum, aldığım veriyi serial monitorde düzgün görüntüleyebiliyorum ide üzerinde, c#ta da ilk mesajda yazdığım gibi timerla değilde veri geldiği zaman okuma yap diyerek almaya çalışıyorum ama arada hatalı değerler çıkıyor işte.

    timerla yemez hocam.

    ilk etap.

                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    serialPort.Open(); 

    Porttan gelen verileri alıp yazdırmada şöyle;

           void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string data = serialPort.ReadExisting();
                richTextBox1.AppendText(data.ToString());
            }

    Şunlarla yaptığımda timer'a gerek kalmadan 1 milisaniyeyle verileri 3 digit halinde çekebiliyorum. 16 bitlik veri gönderiyorum ben..

    erc doğru söyler 


    arbeit macht frei
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    erc bunu yazdı

    timerla yemez hocam.

    ilk etap.

                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    serialPort.Open(); 

    Porttan gelen verileri alıp yazdırmada şöyle;

           void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string data = serialPort.ReadExisting();
                richTextBox1.AppendText(data.ToString());
            }

    Şunlarla yaptığımda timer'a gerek kalmadan 1 milisaniyeyle verileri 3 digit halinde çekebiliyorum. 16 bitlik veri gönderiyorum ben..

    timerla yemeyeceğini biliyorum zaten, hani milisaniye kayma olsa giden veri boşa gider, alacak kısımda bir değer okuyamaz.

    serialPort.DataReceived += kısmını form.Designer.cs kısmında toolboxdan eklediğim serialPort nesnesinin özelliklerine yazdım, başlat ve dur diye iki butonum var, seriportu başlat butonuna tıklanıldığında açıyorum. Buralarda bi hatam olsa hiç değer alamam, ben değeri alıyorum ama arada bir hatalı alıyor.

    DataBits değeri 8, baud hızı arduinodada uygulamada da 57600, buffersize 4096.

    Pythonun pyserial kütüphanesiyle denediğimde de bazen boş yazdırıyodu.


    :)
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erc
    erc's avatar
    Kayıt Tarihi: 23/Aralık/2010
    Erkek
    wasd bunu yazdı
    erc bunu yazdı

    timerla yemez hocam.

    ilk etap.

                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    serialPort.Open(); 

    Porttan gelen verileri alıp yazdırmada şöyle;

           void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string data = serialPort.ReadExisting();
                richTextBox1.AppendText(data.ToString());
            }

    Şunlarla yaptığımda timer'a gerek kalmadan 1 milisaniyeyle verileri 3 digit halinde çekebiliyorum. 16 bitlik veri gönderiyorum ben..

    timerla yemeyeceğini biliyorum zaten, hani milisaniye kayma olsa giden veri boşa gider, alacak kısımda bir değer okuyamaz.

    serialPort.DataReceived += kısmını form.Designer.cs kısmında toolboxdan eklediğim serialPort nesnesinin özelliklerine yazdım, başlat ve dur diye iki butonum var, seriportu başlat butonuna tıklanıldığında açıyorum. Buralarda bi hatam olsa hiç değer alamam, ben değeri alıyorum ama arada bir hatalı alıyor.

    DataBits değeri 8, baud hızı arduinodada uygulamada da 57600, buffersize 4096.

    Pythonun pyserial kütüphanesiyle denediğimde de bazen boş yazdırıyodu.

    SerialPort sınıfından bir nesne üretip deneyin hocam,yalnız voidlerin üstünde yani "private void btnBaslat_click()" eventının üstünde

    ilk etap;

    SerialPort serialPort = new SerialPort(); 

    Başlatma butonu için;

     private void btnBaslat_Click(object sender, EventArgs e)
            {
                btnBaslat.Enabled = false;
                btnBitir.Enabled = true;
                richTextBox1.Text = "";
                try
                {
                    serialPort.PortName = "COM3"; // Veya sizin her neyse hocam
                    serialPort.BaudRate = 57600;
                    serialPort.DataBits = 8;
                    serialPort.Parity = Parity.None;
                    serialPort.StopBits = StopBits.One;
                    serialPort.Handshake = Handshake.None;
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    serialPort.Open(); 
                }
                catch (Exception hata)
                {
                    MessageBox.Show(hata.Message);
                }
               
            }

    Bitir Butonu için;

     private void btnBitir_Click(object sender, EventArgs e)
            {
                btnBaslat.Enabled = true;
                btnBitir.Enabled = false;
                serialPort.Close();
            }

    Aldığınız verileri richtextbox'a yazmak için;

    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string data = serialPort.ReadExisting();
                richTextBox1.AppendText(data.ToString());
            }

    Kolay gelsin..

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Elif - Efe
    undefined-01
    undefined-01's avatar
    Kayıt Tarihi: 19/Aralık/2003
    Homo

    sorun cozuldumu bilmiyorum ama ReadExisting ile okumak cok saglikli bi yontem degil oncelik ile bunu belirtiyim.

    ben byte arrayi olarak okumayi daha saglikli buluyorum. bytesToRead ile datanin tamaminin gelmesini bekleyebilirsin veya receivetimeout (C#da readTimeOut 'da olabilir emin degilm) suresini degistirip tekrar dene diyecegim.

     

    Byte olarak okumak icin :

    serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

                {

                    // Obtain the number of bytes waiting in the port's buffer

                    int bytes = comport.BytesToRead;

     

                    // Create a byte array buffer to hold the incoming data

                    byte[] buffer = new byte[bytes];

     

                    // Read the data from the port and store it in our buffer

                    comport.Read(buffer, 0, bytes);

                    kartID = buffer;

                    // Show the user the incoming data in hex format
                   Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));

                }

     


    Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. DM vs atın.
Toplam Hit: 3136 Toplam Mesaj: 10