C# Seri Port Okuma
-
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.
-
" serialPort.BaudRate = 5760"
denediniz mi hocam portu açmadan önce ?
-
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.
-
arduniodan veriyi kaç bit gönderiyorsun bir de tipi ne ?
-
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.
-
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 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
-
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.
-
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..
-
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(objectsender, 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));}
