Strona 1 z 1
RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 10:32
autor: e_gregor
Robię VI który ma sie komunikowac z pewnym urzadzeniem po RS232. Problemem jest to że bit parzystości wykorzystywany jest do przesyłania dodatkowych informacji. Niestety nie wiem jak odczytywać stan bitu parzystości
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 11:30
autor: piotrp
a probowales (LABVIEW 7.1)
INSTRUMENT IO >> VISA >> VISA ADVANCED >> PROPERTY NODE mozesz wybrac z niego serial settings >> serial parity
moze to rozwiaze Twoj problem ;)
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 11:52
autor: jogurt_owocowy
Nie rozwiąże, bo ta własność zwraca ustawienia portu zadane przy jego otwieraniu.
A jak wyglądają pozostałe parametry transmisji, liczba bitów danych, stopu, prędkość... ?
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 11:54
autor: e_gregor
Tak, to prawie działa. Problerm jest taki że lecą sobie bajty, jeśli bit parzystość=1 to jest to bajt adresu, jeśli bit parzystości=0 jest to bajt danych. Najpier czekam na adres, gdy go poprawnie odbiorę muszę przestawić sie na parzystości=0. Kiedy zrobie to opisaną przez Ciebie metodą port szeregowy robi coś w rodzaju inicjalizacji. Efektem tego jest utrata conajmniej jedengo bajtu danych po bajcie adresowym.
Gdy ustawiłem bez kontroli bitu parzystości wszystko działa i nic nie tracę... do czasu gdy bajt danych nie zostanie odebrany jako adres (bo nie sprawdzam bitu parzystości który jest znacznikiem adresu)
Parametry transmisji: 9600, 2 bity stopu (chodzi tez na 1 tak samo), 8 bitów danych
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 14:05
autor: jogurt_owocowy
Hm.
Jak ktoś używa bitu parzystości niezgodnie z przeznaczeniem to niech ma za swoje
Sam to wymyśliłeś czy robisz "po kimś" ? Jak sam to lepiej chyba zmienić protokół na bardziej "ludzki".
Nie mam doświadczeń z takim czymś (ani jak ich nabyć na szybko), ale...
UART portu szeregowego ma rejestr LSR (Line Status Register), w którym przechowuje między innymi informację o występowaniu błędu parzystości, spróbuj to wykorzystać w połączeniu z klockiem In Port (adres najpewniej 3FDh - szczegóły w BIOSIE). Znacznik błędu parzystości to bit 2. - szczegóły
tutaj
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 16:22
autor: e_gregor
Dzięki za poradę. Wiem o co Ci chodzi ale nie mam zielonego pojęcia jak z Labview się do tego odwołać (za mało doświadczenia w LV)
No niestety jest to wewnętrzny firmowy protokół transmisji między urządzeniami a ja w Labview robię system który będzie na PC-cie symulował jedno z takich urządzeń. Nie mam możliwści zmiany protokołu
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 17:43
autor: jogurt_owocowy
No tak w teorii to byłoby coś takiego jak na obrazku i powinno to to zwracać aktualny stan znacznika błędu parzystości z rejestru LSR w uarcie.
Ale...
1. trzeba czytać z portu przychodzące bajty na bieżąco(po jednym!) i w momencie odczytu sprawdzać od razu rejestr z czego wniosek, że najlepiej wybrać możliwie najwolniejszą transmisję.
2. nie wiem, czy w ogóle uart ustawia ten bit jeśli nie jest ustawiona kontrola parzystości (choć chyba powinien)
Nie wygląda to za dobrze, ale spróbować można. Upewnij się czy adres COMa w biosie to 3F8h. Dla odczytu LSR na wejście In Port trzeba podać adres COMa + 5
Pozdrawiam (:
Re: RS 232 - jak sprawdzać parzystość???
: 16 sie 2006 18:13
autor: e_gregor
No rozumiem. Sprawdzę jutro to rozwiązanie - może to być wystarczające.
Dzięki
Re: RS 232 - jak sprawdzać parzystość???
: 17 sie 2006 05:25
autor: e_gregor
Mam pytanie: czy nie można tego zrobić tak że ustawię że bit parzystości na stałe ma być zerem i sprawdzać error code z Serial Port Read w celu wystapienia błedu parzystości?
Re: RS 232 - jak sprawdzać parzystość???
: 17 sie 2006 09:51
autor: jogurt_owocowy
Oczywiście - jeśli tylko klocek Serial Read zwraca taki błąd to można. A zwraca?
Re: RS 232 - jak sprawdzać parzystość???
: 18 sie 2006 09:16
autor: Ender
Ustawienie bitu parzystosci na stale jest chyba jedynym rozsadnym rozwiazaniem zapobiegajacym utracie danych w trakcie przekonfigurowania portu.
Ale ....
Serial read zwraca blad parzystoci (error code: Hex 0xBFFF006A). Niestety z tego co udalo mi sie wyczytac, w Labview 7.0 i wyzszych towarzyszy temu zapisanie danych samymi zerami - ma to w teorii zapobiegac odczytaniu przez uzytkownika blednego bajtu danych. Czyli jak otrzymasz blad parzystosci to automatycznie bedziesz mial 0x00 jako dane. Rozwiazania sa z tego co wyczytalem dwa:
Pierwsze, sugerowane przez NI, polegajace na dwukrotnym odczycie tego samego bajtu - raz z parity=space a drugi raz z =mark i na tej podstawie okreslenie wartosci bitu parzystosci nie wchodzi chyba w gre, bo za dlugo trwa.
http://digital.ni.com/public.nsf/allkb/ ... 990057F919
Twoj problem byl poruszany na forum NI (widac taki protokol jest czesciej stosowany) i jedyne rozwiazanie na ktore sie natknalem jest tutaj
http://forums.ni.com/ni/board/message?b ... ing&page=1
Najistotniejsze sa 2 ostatnie posty w ktorych podana jest wersja driver'ow oraz co i gdzie nalezy zamienic aby wylaczyc nadpisywanie bajtu danych.
Napisz jak uda Ci sie cos z tym rozsadnego zrobic
Re: RS 232 - jak sprawdzać parzystość???
: 18 sie 2006 13:18
autor: jogurt_owocowy
No tak czułem, że to gdzieś musi być, a nie mogłem znaleźć
To ostatnie rozwiązanie musi działać szkoda tylko, że trzeba configi zmieniać.
A swoją drogą jest we właściwościach Serial Settings:Error Replacement Character, gdzie sobie można ustawić co chcemy dostać zamiast błędnych bajtów i aż dziw, że nie można tego zastępowania programowo wyłączyć.
Re: RS 232 - jak sprawdzać parzystość???
: 22 sie 2006 08:53
autor: e_gregor
To działa!!! U mnie sa drivery Visa 3.4.0.49****
Trzeba dodać wpis DisableErrorReplacement=1
Gdzieś w sekcji [ASRL-RSRC-ALIAS]
W pliku visaconf.ini
Który można znaleść w C:VXIPNPWinNTNIvisa.