Strona 1 z 1
RS 232 z termination char - raz jeszcze
: 26 sie 2008 12:55
autor: smiglo
Witam,
wiem, że podobny temat już był.
Ale mam za zadanie odczytać dwie ramki danych (które kończą się LF (0xA)) z urządzenia podłączonego do portu szeregowego, Obie ramki przychodzą jednocześnie co 50 ms. Mam więc program na odczyt tych danych ale nie jestem z niego zadowolony - zdarza się że odczyty są stabilne, ale nieraz jak zacznie się sypać transmisja to nic sensownego nie można z niej wyciągnąć. W windowsowym hyper terminalu wygląda to ładniej - nie widać żeby pojawiały się krzaczki. Gdzie leży przyczyna?
Wszystko stoi na biurku i strach pomyśleć jak je opuści i zacznie pracować wśród zakłóceń.
pozdrawiam
RS 232 z termination char - raz jeszcze
: 26 sie 2008 13:07
autor: sambo
Czy długość ramki jest stała ? Możesz podać jakąś przykładową ?
Zo bacz jak działa ten program.
Re: RS 232 z termination char - raz jeszcze
: 26 sie 2008 13:31
autor: smiglo
Długość ramki (docelowo) nie jest stała. W tej chwili odbieram ramki stałej długości, które wyglądają mniej więcej tak:
Naglowek1, pole liczbowe, pole liczbowe, pole liczbowe CR LF
Naglowek2, pole liczbowe, pole liczbowe, pole liczbowe, pole liczbowe CR LF
Pola liczbowe mają różną wielkość stąd różne długości łańcuchów - ich długośc nie przekracza jednak 100 znaków.
W tej chwili przesyłane są same przecinki z nagłówkiem, więc długości są stałe.
Re: RS 232 z termination char - raz jeszcze
: 26 sie 2008 14:48
autor: sambo
Zobacz i daj znacz czy działa ten program...
Re: RS 232 z termination char - raz jeszcze
: 28 sie 2008 08:58
autor: smiglo
Zachowanie jest podobne - poza tym program pochałania sporą ilość czasu na odczytanie tych danych - i może nie być czasu na inne rzeczy...
RS 232 z termination char - raz jeszcze
: 28 sie 2008 18:21
autor: ky3orr
wystarczy w pętli odczytującej dodać małe opóźnienie - np 2-10ms i wykorzystać bloczek bytes at port (ponieważ w tym czasie może przyjść do bufora wejściowego więcej niż 1 znak).
powinno to doskonale odciążyć procesor, a inne elementy jak na przykład obsługa interfejsu może odbywać się w innej pętli while.
RS 232 z termination char - raz jeszcze
: 29 sie 2008 06:29
autor: sambo
Zmniejsz prędkość transmisji, zacznij od jakies małej np. 19200 i stopniowo ją zwiększaj.
Re: RS 232 z termination char - raz jeszcze
: 02 wrz 2008 12:18
autor: smiglo
No właśnie:
jak wstawię choćby 1 ms opóźnienia to przy ilości bajtów rzędu 200 mam już opóźnienie, które jest nie do przyjęcia (dane przychodzą co 50 ms).
RS 232 z termination char - raz jeszcze
: 02 wrz 2008 12:23
autor: Mikrobi
Mam takie uwagi 1. Wykorzystaj węzeł Bytes At Serial Port 2. Windows nie da ci powtarzalności lepszej niż 10-20 ms, system ma swoje wymagania, wiec rozmawianie o 1ms, czy nawet 5 ms jest trochę.... nieścisłe.
Opóżnienie od strony kodu gwarantuje, że środowisko nie bedzie walczyło z systemem o dostęp do zasobów. 3. UART na płycie czy każdy RS ma jakiś bufor pamięci, nie musisz natychmiast czytać bitu kiedy wchodzi drutem do komputera. ;)
RS 232 z termination char - raz jeszcze
: 02 wrz 2008 12:30
autor: sambo
Ja tak z ciekawości się zapytam co to za urządzenie jest i na jaką odległość jest przewidziana transmisja ?
Re: RS 232 z termination char - raz jeszcze
: 02 wrz 2008 12:50
autor: smiglo
Bytes at serial port zastosowałem w programie, którego kod załączyłem na początku. W zasadzie więc przeróbki pierwotnego programu sprowadzają się do "programowego" wyszukiwania CR LF. Pytanie czy jest to lepszy sposób niż korzystanie z Termination char z LV???
Re: RS 232 z termination char - raz jeszcze
: 02 wrz 2008 14:04
autor: smiglo
Zastanawiam się czy:
a) lepiej odczytywać jak leci wszystko co jest w buforze przy wyłączonej opcji Termination char i następnie rozdzielać odebraną informację na dwa interesujące mnie stringi
b) korzystać z włączonej opcji Termination char i dwukrotne odczytywać bufor odbiorczy (tak jak zrobiłem to w pierwszym programie).
c) ????
Re: RS 232 z termination char - raz jeszcze
: 02 wrz 2008 14:18
autor: sambo
Zobacz to...