Usart verileri parçalı gönderiyor.

Başlatan baran123, 19 Haziran 2015, 20:56:54

baran123

RealTerm ile denedim bir sorun olmadı.Benim C# tarafında problem var.Bunu nasıl byte byte alabilirim ?

z

Kaçamak bir çözüm.

STM ile string gönderdikten hmen sonra mesela 0xFF yolla.

PC deki yazılım gelen verileri ancak 0xFF aldığında değerlendirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

baran123

Hocam yolluyorum.Ama yine aynı.Zaten ReadExisting ile okuduğum için önce stringi alıp tekrar ReadExisting ile bu son işareti almaz mı ?
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (SP.IsOpen)
            {
                InputData = SP.ReadExisting();
                if (InputData != String.Empty)
                {
                    if (InputData.IndexOf("*") != -1)
                    {
                        this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
                    }
                }
            }
            else
                MessageBox.Show("There are no open ports", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }


Stm de şöyle gönderdim.
USART_SendString(USART1, "LED On\r\n");
USART_SendData(USART1, '*');

z

Tamam * alıncaya kadar hiç bir şey yapma sende. olmuyormu?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

baran123

Hocam o zaman byte byte alacam taki * gelene kadar.Bu byte byte alma işini yapamadım.

z

Hayır byte byte almana gerek yok o zaman

Diyelimki veri geldi ama sonunda * yok. Gelen veriyi at bir kenara beklet. Yeni veri geldiğinde arada sonda nerede * görürsen o kısmı önceden gelene ekle. Son aldığın pakette * dan sonra karakter varsa bu kez onları da at bir kenara.

Güzel ve kökten çözüm değil ama işini görür.

STM ile son datayı gönderdikten sonra bolca yıldız da yollayabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

birkaç sorum olacak

this.txtDataRx.AppendText(text + "\r\n");

gelen datanın ardına neden \r\n ekledin ?


ST de gönderdiğin datanın ardına \r\n eklemene rağmen neden aldığın bilgiyi
SP.ReadExisting() ile kontrol ettin ?


SP.ReadExisting() ile alırsan en ufak bir bilgide event oluşur, eğer sen MCU dan string gönderip CRLF (\n\r) ekliyorsan Readline ileile kontrol etmelisin. SP.Readline yapmalısın, bu MCUdan gelen bilgiyi \r\n gelene kadar buffer a doldurur, bu karekterleri gördüğünde datareceiver olayını tetikler.

baran123

Oldu ! Hocam textboxda her gelen veri yeni bir satıra insin diye.Yoksa hepsi arka arkaya ekleniyor.
Ben bu olayı" SP.Readline yapmalısın, bu MCUdan gelen bilgiyi \r\n gelene kadar buffer a doldurur, bu karekterleri gördüğünde datareceiver olayını tetikler."
SP.ReadExisting() için sanmıştım.Şimdi çalıştı.Teşekkürler. :)

muhittin_kaplan

#23
this.txtDataRx.AppendText(text + "\r\n");
daki CRLF ye gerek yok

mesaj birleştirme:: 24 Haziran 2015, 23:28:28

he anladım, sen bunu textbox un yeni satıra geçmesi için yapıyorsun, tamam ozaman lazım.