Strona 1 z 1

odczyt danych rs232 o zmiennej długości z termination char

: 13 kwie 2008 18:50
autor: ky3orr
witam!

moje pytanie niestety podyktowane jest brakiem mozliwości przetestowania transmisji rs232.
zastanawiam się nad działaniem Termination char przy Configure Serial Port: mam ustalony znak kończący transmisję i odbieram dane, które opatrzone są takim znakiem na ko ńcu jednak nie wiem ile znaków przyjdzie na port.
krótko mówiąc komunikat jest o zmiennej długości.

czy jeśli postawię bloczek Bytes at port to on zwróci mi ile jest bajktów, ale po odebraniu termination char?

w jaki sposób to działa? czy ustalenie termination char ma wpływ na działanie Visa Read?

pozdrawiam

odczyt danych rs232 o zmiennej długości z termination char

: 02 lip 2008 12:35
autor: ky3orr
Pozwolę sobie odświeżyć temat i zadać pytanie trochę inaczej:

Czy ustalenie konkretnej liczby bajtów do odczytania "Bytes to read" w przypadku odczytu z portu szeregowego i jednoczesne ustawienie w konfiguracji obsługi znaku terminującego spowoduje zakończenie odbioru, w przypadku przesłania mniejszej liczby znaków niż wynika to z wartości bytes to read, zaraz po odebraniu znaku terminującego?

co właściwie daje liczba znaków do doczytu jesli jest właczona obsługa termination char?
czy chodzi o to, że wystąpi timeout gdy nie nadejdze termination char, a wciąz będą leciały dane?

i dodatkowo jak radzić sobie z obsługą bloczu Bytes at port? czy należy czytać cyklicznie w pętli ile bajtów jest na porcie czy bloczek zwraca liczbe bajtów odebranych dopiero po wykryciu termination char, a jak nie nadejdzie to timeout?

pozdrawiam

Re: odczyt danych rs232 o zmiennej długości z termination

: 04 lip 2008 19:41
autor: jogurt_owocowy
Chyba najlepszą odpowiedzią będzie taki przykład:
Jako termination char jest wykorzystywany znak nowej linii (0xA).
1. Do portu został wysłany taki string:
wiersz numer jeden wiersz numer 2 wiersz 3
2. Teraz w pętli odczytujesz dane za pomocą takiego kodu
[img]http://www.labview.pl/uploads/veir/read ... 20port.gif[/img]
Klocek Bytes At Port zwraca wartość 42 (tyle jest bajtów w porcie), ale VISA Read przeczyta tylko pierwszy wiersz i jego długość (19 bajtów) wyrzuci na wyjściu bytes read.
Przy kolejnym wywołaniu na wyjściu Bytes At Port dostaniesz 23 (42-19 - tyle bajtów pozostało nieodczytanych), a VISA Read przeczyta drugi wiersz (bytes read = 15) Jak nietrudno się domyślić przy trzecim wywołaniu w porcie został tylko trzeci wiersz, więc na wyjściu Bytes At Port zostanie zwrócona wartość 8 i wszystkie bajty do końca zostaną przeczytane przez VISA Read, a więc bytes read = 8.
Pozdrawiam

odczyt danych rs232 o zmiennej długości z termination char

: 04 lip 2008 21:08
autor: ky3orr
@jogurt_owocowy dzieki za odpowiedz. uwagi przedstawione sa cenne.

mam dodatowe pytanie: co sie dzieje gdy na port ciagle splywaja dane i nie bylo jeszcze termination char, a kod przytoczony przez Ciebie sie wykona? czy dziala to tak, ze bytes at port zawsze podaje aktualna liczbe w buforze na czas wykonywania bloczka, a VISA z tego co poda ten blok stara sie przeczytac cos do znaku terminujacego (i co jak go jeszcze nie ma?), czy bytes at port zwraca zawsze 0 dopoki nie przyjdzie termination char, jesli wlaczona jest jego obsluga, wreszcie czy tylko Visa Read jest czula na termination char?

troche to zamieszane, ale tak szczegolowej informacji jeszcze nigdzie nie znalazlem :)

pozdrawiam

Re: odczyt danych rs232 o zmiennej długości z termination

: 04 lip 2008 22:39
autor: jogurt_owocowy
bytes at port zawsze podaje aktualna liczbe w buforze na czas wykonywania bloczka, a VISA z tego co poda ten blok stara sie przeczytac cos do znaku terminujacego
Tak.
Dokładniej mówiąc, VISA Read czyta z bufora tyle bajtów, ile sobie program zażyczy (na wejściu byte count) chyba, że w strumieniu bajtów pojawi się termination char - wtedy odczyt jest przerywany.
czy bytes at port zwraca zawsze 0 dopoki nie przyjdzie termination char, jesli wlaczona jest jego obsluga
Nie.
czy tylko Visa Read jest czula na termination char?
Tak ]

odczyt danych rs232 o zmiennej długości z termination char

: 10 lip 2008 11:46
autor: ky3orr
jogurt_owocowy zrodziło mi się jeszcze takie pytanie: co zrobić z przypadkiem, gdy jedyną informacją, zważywszy na zmienna długość komunikatu, o zakończeniu przesyłania danych jest znak terminujący?

nie mam pojęcia ile będzie znaków więc nie wiem co podać na bytes to read.
jedyną rzeczą jaką wiem to ile maksymalnie może przyjść znaków i nic poza tym.
odbiór realizowany jest póki co na żywo po wprowadzeniu opóźnienia pomiędzy wysłaniem żądania danych, a odbiorem.

czy jest jakieś przestestowane podejście do tematu? jak to odbierać skoro nie wiadomo czy odczytane dane są tylko takie jak do tej pory te co trafiły do bufora wejściowego, czy wszystko co przyszło, ponieważ pojawił sie termination char?

czy w takim przypadku należy przejść do odbioru bajt po bajcie (w pętli while) i samemu sprawdzać czy termination char się pojawił?

Re: odczyt danych rs232 o zmiennej długości z termination

: 10 lip 2008 12:11
autor: wino
może na przykład tak:
Zbierasz sobie po 100, albo 1000 znaków i sprawdzasz za pomocą Match Pattern, albo Search Into String czy wśród nich znajduje się termination char/string.
Taki odbiór pakujesz do pętli while.
Jeśli przyjdzie oczekiwany znak końca kończysz pętle.
pzdr

Re: odczyt danych rs232 o zmiennej długości z termination

: 10 lip 2008 15:50
autor: jogurt_owocowy
czy w takim przypadku należy przejść do odbioru bajt po bajcie (w pętli while) i samemu sprawdzać czy termination char się pojawił?
Prawie bingo.
Nie musisz czytać bajt po bajcie, bo VISA Read czyta do termination char albo do końca bufora. Czytasz więc wszystkie bajty z portu, porównujesz ostatni bajt z termination char i jeśli nim jest, to zwracasz odczytane dane jako kompletną wiadomość, jeśli nie - odczytujesz kolejną porcję danych, dołączasz do poprzedniej, sprawdzasz czy ta kolejna kończy się oczekiwanym znakiem końca itd. aż ostatni bajt odebranych danych nie będzie równy termination char.
Rysunek poniżej.
Pozdrawiam

odczyt danych rs232 o zmiennej długości z termination char

: 10 lip 2008 19:47
autor: ky3orr
ooOOOooooo o to chooodzi :)

przetestuję jak będę na obiekcie. dziękuję za pomoc wszystkim.

z tego co rozumiem to powinienen czytac wszystko co jest, bez obsługi termination char?
jeśli jest załączona jego obsługa to wpada on do danych odebranych czy nie?