Skocz do zawartości

[Programowanie] Port szeregowy i interfejs USART czyli komunikacja mikrokontrolera z komputerem


Pomocna odpowiedź

(edytowany)

Witam

Po pierwsze - dziękuje za ten przykład, bardzo się przydał.
Ale nie do końca poprawnie to u mnie działało... Przy większej transmisji przychodzącej pojawiało się tylko część tekstu i z dziwnymi opóźnieniami. Zauważyłem też że przy próbie wysyłania czegoś nagle pojawiały się kolejne fragmenty tekstu który wcześniej "nie doszedł".
Program zakłada że każde zdarzenie pojawienia się danych to jeden bajt danych a tymczasem przychodziło więcej.
Zmodyfikowałem troche ten fragment odpowiadający za reakcje na zdarzenie i teraz śmiga.
(przy okazji jest tu też zmiana aby przychodzące dane były wyświetlane w formie tekstu a nie hex)
 

private void WpiszOdebrane()
        {
            var temp = "";
            while (port.BytesToRead > 0)
            {
                temp += Convert.ToChar(port.ReadByte());
            }
            DodajKolorowy(rtbTerminal, temp, System.Drawing.Color.Black);
            
        }

 

Edytowano przez Gieneq
Zachęcam do korzystania z bloku kodu
Dnia 4.11.2021 o 23:10, Marek-eM napisał:

Po pierwsze - dziękuje za ten przykład, bardzo się przydał.
Ale nie do końca poprawnie to u mnie działało... Przy większej transmisji przychodzącej pojawiało się tylko część tekstu i z dziwnymi opóźnieniami. Zauważyłem też że przy próbie wysyłania czegoś nagle pojawiały się kolejne fragmenty tekstu który wcześniej "nie doszedł".
Program zakłada że każde zdarzenie pojawienia się danych to jeden bajt danych a tymczasem przychodziło więcej.
Zmodyfikowałem troche ten fragment odpowiadający za reakcje na zdarzenie i teraz śmiga.
(przy okazji jest tu też zmiana aby przychodzące dane były wyświetlane w formie tekstu a nie hex)

Obie wersje są błędne - każda będzie powodowała inne efekty uboczne.

Ogólnie zdarzenie OnDataReceived działa całkiem dobrze, aczkolwiek często potrafi sobie "zgubić" dane, zwłaszcza jeżeli dane przyjdą w momencie, gdy są przetwarzane. Poza tym często nie jest wykonywane przy każdym wystąpieniu nowych danych, tylko co pewien czas, stąd był taki efekt.

W przypadku BytesToRead jest podobnie, tylko tutaj BytesToRead potrafi zmienić się na 0, kiedy jeszcze są dane do odebrania, albo całkowicie nie wykazać danych na porcie.

Najlepszą metodą jest użycie bezpośredniego strumienia i odczyt za pomocą stosownych obiektów. Wtedy port jest najbardziej "reliable".

serialPort.BaseStream.BeginRead

To powyżej dla szukających 😉 

  • 9 miesiące później...

Troszkę wykopuję temat, ale chciałbym podpytać o jedną kwestię. Program faktycznie działa fajnie, ale ciekaw jestem, czy po detekcji użytego portu COM można pójść troszkę dalej. Załóżmy, że do portu COM3 podłączamy jakiś moduł USB z FT232 i chciałbym pobrać nazwę tego modułu (tą, która wyświetli się w menedżerze urządzeń po podpięciu do USB - dajmy na to "FTDI USB UART") i chcemy wyświetlić w tym naszym oknie Log zamiast "Rozpoczęto połączenie z COM3" coś w rodzaju "Rozpoczęto połączenie z COM3: FTDI USB UART". Czy w obrębie tych narzędzi z poradnika da się to w miarę prosto zrobić, czy trzeba wychodzić dużo dalej? Internet podpowiada użycie System.Management, tylko że osoby go używające zazwyczaj budują program tak, aby tego naszego System.IO.Ports (w tym np. SerialPort.GetPortNames();) już nie używać w ogóle, więc to trochę inna metodyka, a jakoś ten program i metodyka z poradnika Gandalfa chyba najbardziej mi odpowiada i wolałbym po prostu coś do niej dołożyć.

  • 2 lat(a) później...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...