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

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
ky3orr
Posty: 149
Rejestracja: 10 gru 2006 00:00
Wersja środowiska: LabVIEW 8.6
Lokalizacja: Siechnice
Kontakt:

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

Post 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
KY3ORR

Okablowanie audio / RF -> www.CabLAB.eu
Awatar użytkownika
ky3orr
Posty: 149
Rejestracja: 10 gru 2006 00:00
Wersja środowiska: LabVIEW 8.6
Lokalizacja: Siechnice
Kontakt:

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

Post 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
KY3ORR

Okablowanie audio / RF -> www.CabLAB.eu
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

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

Post 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
Ostatnio zmieniony 04 lip 2008 22:34 przez jogurt_owocowy, łącznie zmieniany 2 razy.
Awatar użytkownika
ky3orr
Posty: 149
Rejestracja: 10 gru 2006 00:00
Wersja środowiska: LabVIEW 8.6
Lokalizacja: Siechnice
Kontakt:

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

Post 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
KY3ORR

Okablowanie audio / RF -> www.CabLAB.eu
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

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

Post 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 ]
Awatar użytkownika
ky3orr
Posty: 149
Rejestracja: 10 gru 2006 00:00
Wersja środowiska: LabVIEW 8.6
Lokalizacja: Siechnice
Kontakt:

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

Post 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ł?
Ostatnio zmieniony 10 lip 2008 11:57 przez ky3orr, łącznie zmieniany 1 raz.
KY3ORR

Okablowanie audio / RF -> www.CabLAB.eu
Awatar użytkownika
wino
Posty: 549
Rejestracja: 23 gru 2005 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Kraków

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

Post 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
Awatar użytkownika
jogurt_owocowy
Posty: 1317
Rejestracja: 30 lis 2004 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków

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

Post 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
Ostatnio zmieniony 10 lip 2008 16:33 przez jogurt_owocowy, łącznie zmieniany 2 razy.
Awatar użytkownika
ky3orr
Posty: 149
Rejestracja: 10 gru 2006 00:00
Wersja środowiska: LabVIEW 8.6
Lokalizacja: Siechnice
Kontakt:

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

Post 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?
KY3ORR

Okablowanie audio / RF -> www.CabLAB.eu
ODPOWIEDZ