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.
trzeba pętli na podstawie wyniku '.Read' (czyli połączeń' .Read' wielokrotnie –
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. –
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