Skocz do zawartości

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


GAndaLF

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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 😉 

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.