Odczyt danych z portu szeregowego, znak CR na ko

Wszystko związane z jądrem systemowym, sterownikami, sprzętem itp.
stefan_bak
Posty: 2
Rejestracja: 07 marca 2012, 00:25

Odczyt danych z portu szeregowego, znak CR na końcu ramki

Post autor: stefan_bak »

Witam.
M
am spory problem z odczytem danych z portu szeregowego. Mam wbudowany port (com) na płycie głównej i Debian wykrywa go jako ttyS0.

Chciałem przechwytywać dane swoim programem poprzez polecenie fread po uprzednim skonfigurowaniu portu programem stty. Na początku wszystko ładnie działało. Ustawiłem sobie, żeby program fread odczytywał po 128 bajtów, przez co zawsze pobierał mi całą ramkę wysyłaną z drugiego komputera pod warunkiem, że była mniejsza lub równa 128 bajtów, ale niezależnie od jej zawartości. Po kilku godzinach testów Debian przestał wysyłać zwykłe ramki i funkcja fread zwracała pustą wartość. Od tamtej pory jedyną możliwością żeby odczytać coś poprzez fread jest wysłanie do Linuksa ramki zakończonej bajtem 0D. Przykład:
Wysyłam z drugiego kompa 3 ramki pod rząd:

Kod: Zaznacz cały

1. E4 A1 A2
2. 3D EE D4
3. 00 0A 0D
Debian ma w pętli zaimplementowany odczyt i dopiero po wysłaniu trzeciej ramki wyświetla coś takiego:

Kod: Zaznacz cały

E4 A1 A2 3D EE D4 00 0A 0D
Dzieje się tak niezależnie ile danych wyślę, jeżeli nigdzie nie pojawi się 0D to nie przekaże danych do /dev/ttyS0. Wniosek jest taki, że nie jest to raczej wina ustawień bufora.

Podejrzewam, że jest to kwestia jakiś ustawień stty, ale nie mogę sam dojść gdzie ustawić żeby przesyłał dane z portu nie czekając na znak CR/LF. Dziwne jest też to, że na początku tego nie było. Problem pojawił się po jakimś czasie i nie wydaje mi się żebym coś zmieniał. Reset systemu nie pomaga, proszę o pomoc, bo docelowo urządzenie, które ma pracować z Debianem nie wysyła na końcu ani CR ani LF i Linux nie pozwala mi to dokończyć pracy.

System to Debian 6.0.3
Płyta ASUS P4BP-MX
Procesor PentiumIV 2.4GHz

Pozdrawiam.
stefan_bak
Posty: 2
Rejestracja: 07 marca 2012, 00:25

Post autor: stefan_bak »

Próbowałem z tymi paczkami, ale niestety bez efektu.
Podłączyłem do siebie dwa porty z tego samego komputera. Po wysłaniu:

Kod: Zaznacz cały

echo "TEST" > /dev/ttyUSB0 
Mój program w C odbiera dane i wyświetla. Jest to spowodowane tym, że Linux sam z siebie kończy linijkę znakiem LF, jeżeli natomiast sam zdefiniuję dokładnie znaki jakie ma wysłać to zaczyna się problem, bo bez #10 lub #13 na końcu program w C nie wyświetla nic.

Proszę o jakieś wskazówki, przejrzałem podręczniki systemowe i nic nie wyczytałem
borgul
Posty: 4
Rejestracja: 03 stycznia 2012, 21:45

Post autor: borgul »

sprawdź parametry (na wejściu) icrnl, igncr, inlcr, (na wyjściu) ocrnl, onlcr
ODPOWIEDZ