2015-08-19 11 views
5

Próbowałem wszystkiego, co mogę znaleźć w sieci, i nic nie pomogło, więc muszę zwrócić się do was, dobrzy ludzie, aby trochę oświecić.Nie otrzymuję wszystkich danych seryjnych

Używam Visual C# 2013, .NET Framework 4.5 (mam nadzieję, mam tagów poprawne)

Pisałem kod osadzony na dłuższą chwilę i jestem bardzo wygodne z nim. To C# stuff jest zupełnie innym zwierzęciem.

Mam program napisany na mikrokontrolerach ARM, który rozmawia szeregowo z programem C#. Mam 99,9% pewności, że mikrokontroler przesyła wszystko poprawnie. Użyłem Realterm, aby spojrzeć na dane i wszystko wydaje się dobre, ale nie mogę dostać mojego programu C#, aby otrzymać wszystkie dane w sposób, w jaki powinienem.

Zarówno mikrokontroler, jak i program C# mają ustawione takie same ustawienia (57600 bodów, 8 bitów danych, brak uzgadniania, brak parzystości, jeden bit stopu) Nie jest to wielka sprawa.

Mój problem polega na tym, że ustawię ReceiveByteThreshold na 1, a program dostaje jeden bajt i jest wysyłany do ISR (nie jestem pewien, czy ISR jest poprawnym terminem w języku C#, ale to właśnie nazywam). I tak rozumiem, że to powinno działać.

Mam następujący kod, aby uzyskać bajty.

GlobalVars.data_byte jest array 100 bajtów i jest bytes_to_read 100.

serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read) 

problem jest, jeśli spojrzeć na wartość powrotną funkcji serialPort1.Read, odbija się od 5 do 13 bajtów, ale wysyłam 21 bajtów z mikrokontrolera. Z jakiegoś powodu nie dostanie ich wszystkich.

Teraz, jeśli ustawię ReceiveByteThreshold = 13, dolina powrotna odbija się od 13 do 16. Jeśli ustawię wartość ReceiveByteThreshold = 14 (lub cokolwiek do 21), zwracana wartość będzie ładną wartością stałą 21, tak jak być powinna.

Czy brakuje mi czegoś? Myślałem, że droga to powinno działać to jeśli ReceiveByteThreshold = 1 program zostanie wysłany do ISR, jak tylko pierwszy bajt jest odczytywany i

serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read) 

by przeczytać wszystkie bajty aż widzi bit stopu. Oznacza to, że powinien odczytać wszystkie 21 bajtów.

Nie mogę po prostu zrobić ReceiveByteThreshold = 14, ponieważ nie wszystkie wysyłane dane mają długość 21 bajtów. Czasami jest to tylko 2 bajty, a ISR nigdy nie zostanie wyzwolony.

Mam nadzieję, że jasno to wyjaśniłem.

+0

trzeba pętli na podstawie wyniku '.Read' (czyli połączeń' .Read' wielokrotnie –

+0

nie mam pojęcia jak rób to, o co prosisz, ale twój przykładowy kod wygląda bardzo podobnie do niektórych plików do odczytu z pliku filestream, poszukaj Jona Skeeta i właściwego sposobu czytania pliku i zobacz, czy te same metody ci pomogą. bajty, dopóki wszystkie nie zostaną przeczytane. –

+2

Klasa portu szeregowego ma mały bufor, więc nie wszystkie dane zostaną odczytane w jednym czytaniu(). Powinieneś umieścić Read() w pętli i wywołać Read() wiele razy, aż otrzymasz 21 bajtów. – jdweng

Odpowiedz

0

Pewnego razu ... Byłem prawie w tej samej sytuacji. Bo jak powiedzieli nasi przyjaciele, czasami nie wszystkie dane są przesyłane jednocześnie.
Sprawdź otrzymane. wyślę mojego kodu, mam nadzieję, że pomaga.

var End = '\r'; //Last character for searching 
int dataLength = _serialPort.BytesToRead; 
byte[] data = new byte[dataLength]; 
int nbrDataRead = _serialPort.Read(data, 0, dataLength); 

RxString = Encoding.ASCII.GetString(data); 
txtCodProd.AppendText(RxString); 

if (RxString.IndexOf((char)End) > -1) 
{ 
    this.Invoke(new EventHandler(EndMethod)); //After Get all data, DoSomething  
} 

//RxString = _serialPort.ReadExisting(); // doesn't Work for all data  
Powiązane problemy