Jestem trochę zdezorientowany czytaniem i pisaniem do portu szeregowego. Mam urządzenie USB w systemie Linux, które korzysta ze sterownika konwertera urządzeń szeregowych FTDI USB. Kiedy go podłączam, tworzy: / dev / ttyUSB1.
Pomyślałem, że łatwo będzie go otworzyć i odczytać / zapisać w C. Znam szybkość transmisji i informacje o parzystości, ale wygląda na to, że nie ma na to standardu?
Czy coś mi brakuje, czy może ktoś wskazać mi właściwy kierunek?
c
linux
serial-port
gnychis
źródło
źródło
ioctl
ifcntl
.Odpowiedzi:
Napisałem to dawno temu (w latach 1985-1992, z kilkoma poprawkami od tego czasu ) i po prostu skopiuj i wklej potrzebne bity do każdego projektu.
Musisz zadzwonić
cfmakeraw
natty
otrzymany odtcgetattr
. Nie można wyzerowaćstruct termios
, skonfigurować, a następnie ustawić zatty
pomocątcsetattr
. Jeśli użyjesz metody zerowania, wystąpią niewyjaśnione, sporadyczne awarie, szczególnie na BSD i OS X. „Niewyjaśnione sporadyczne awarie” obejmują zawieszanie sięread(3)
.Wartości prędkości są
B115200
,B230400
,B9600
,B19200
,B38400
,B57600
,B1200
,B2400
,B4800
, itd. Wartości są parytetu0
(czyli bez parzystości),PARENB|PARODD
(włączyć parytetu i używać nieparzyste),PARENB
(włączyć i używać nawet parytetu),PARENB|PARODD|CMSPAR
(znak parzystości) iPARENB|CMSPAR
( parzystość przestrzeni).„Blokowanie” określa, czy
read()
na porcie oczekuje na nadejście określonej liczby znaków. Ustawienie braku blokowania oznacza, że aread()
zwraca dowolną liczbę dostępnych znaków bez czekania na więcej, aż do limitu bufora.Uzupełnienie:
CMSPAR
jest potrzebny tylko do wybrania parzystości znaku i spacji, co jest rzadkością. W większości zastosowań można go pominąć. Mój plik nagłówkowy/usr/include/bits/termios.h
umożliwia definicjęCMSPAR
tylko wtedy, gdy__USE_MISC
zdefiniowano symbol preprocesora . Ta definicja występuje (wfeatures.h
) zUwagi wstępne
<features.h>
mówi:źródło
lsusb
aby wyświetlić wszystkie urządzenia USB. Można by je nazwać inaczej, jeśli twój system ma własneudev
reguły; zobacz/etc/udev/rules.d/
Może stamtąd możesz wybrać port, którego szukasz. Z pewnością wyświetlając, a następnie odłączając / odłączając port, można zidentyfikować różnicę.Dla kodu demonstracyjnego, który jest zgodny ze standardem POSIX, jak opisano w Prawidłowe ustawianie trybów terminala i Poradniku programowania szeregowego dla systemów operacyjnych POSIX , oferowane są następujące informacje.
Zasadniczo pochodzi od drugiej odpowiedzi, ale niedokładne i wprowadzające w błąd komentarze zostały poprawione.
Aby program traktował odebrane dane jako kody ASCII, należy skompilować program z symbolem DISPLAY_STRING, np.
Jeśli odebrane dane to tekst ASCII (a nie dane binarne) i chcesz je odczytać jako linie zakończone znakiem nowej linii, zobacz tę odpowiedź dla przykładowego programu.
źródło
cfmakeraw
poprawnymi?O_NDELAY
lubO_NONBLOCK
. W cmrr.umn.edu/~strupp/serial.html wspomniano, że jeśli otworzysz deskryptor pliku z tymi flagami, toVTIME
zostanie zignorowany. Jaka jest zatem różnica między uruchamianiem zO_NONBLOCK
deskryptorem pliku a wykonywaniem tego zVTIME
?