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