Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięUART programowy - jak rozpoznać że jest znak?
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam szanownych forumowiczów.
Mam pewien problem, otóż używam programowego Uartu RS232.
Używam polecenia INKEY(#1).
Tylko jak odróżnić znak null (0 w kodzie ASCII) od braku znaku. W hardwarowym Uarcie komenda ISCHARWAITING załatwiała sprawę. Jak to zrobić w programowym Uarcie?
Może ma ktoś jakiś pomysł.
Pozdrawiam.
Mam pewien problem, otóż używam programowego Uartu RS232.
Używam polecenia INKEY(#1).
Tylko jak odróżnić znak null (0 w kodzie ASCII) od braku znaku. W hardwarowym Uarcie komenda ISCHARWAITING załatwiała sprawę. Jak to zrobić w programowym Uarcie?
Może ma ktoś jakiś pomysł.
Pozdrawiam.
Również spotkałem się kiedyś z podobnym problemem.
Do programowego UARTu podpięty był skaner kodów kreskowych, którym operator od czasu do czasu coś skanował.
Zrobiłem to tak, że wpadałem na chwilę do pętli sprawdzającej, czy jegomość aby czasem czegoś właśnie nie skanował. Urządzenie pracuje już rok w liczbie 30 szt. Nikt nigdy nie poskarżył się, że coś mu się źle zeskanowało bądź nie zeskanowało wcale, a byłoby to odpowiednio sygnalizowane, bo urządzenie reagowało na odpowiednie kody kreskowe.
Być może metoda sprawdzi się również u Ciebie. Nie jest pewnie doskonała, ale po soiągnięciu zamierzonego celu przestałem poszukiwać innej.
'\\Sprawdzam programowy Uart
Do
A = Inkey(#5)
'Jeśli kod > 0 wtedy odebraliśmy znak
If A >= 32 And A <= 122 Then
Skaner = ""
Znak = ""
Znak = Chr(a)
Skaner = Skaner + Znak
'\\Odczytuję dane
Do
A = Inkey(#5)
If A >= 32 And A <= 122 Then
Znak = Chr(a)
Skaner = Skaner + Znak
Reset Watchdog
End If
If A = 13 Then Exit Do
Loop
No_src = "3"
Print #3 , No_src ; Skaner ; Chr(11);
Skaner = ""
End If
Waitus 1
Reset Watchdog
Incr Bufor
If Bufor = 45000 Then
Bufor = 0
Exit Do
End If
Loop
Do programowego UARTu podpięty był skaner kodów kreskowych, którym operator od czasu do czasu coś skanował.
Zrobiłem to tak, że wpadałem na chwilę do pętli sprawdzającej, czy jegomość aby czasem czegoś właśnie nie skanował. Urządzenie pracuje już rok w liczbie 30 szt. Nikt nigdy nie poskarżył się, że coś mu się źle zeskanowało bądź nie zeskanowało wcale, a byłoby to odpowiednio sygnalizowane, bo urządzenie reagowało na odpowiednie kody kreskowe.
Być może metoda sprawdzi się również u Ciebie. Nie jest pewnie doskonała, ale po soiągnięciu zamierzonego celu przestałem poszukiwać innej.
'\\Sprawdzam programowy Uart
Do
A = Inkey(#5)
'Jeśli kod > 0 wtedy odebraliśmy znak
If A >= 32 And A <= 122 Then
Skaner = ""
Znak = ""
Znak = Chr(a)
Skaner = Skaner + Znak
'\\Odczytuję dane
Do
A = Inkey(#5)
If A >= 32 And A <= 122 Then
Znak = Chr(a)
Skaner = Skaner + Znak
Reset Watchdog
End If
If A = 13 Then Exit Do
Loop
No_src = "3"
Print #3 , No_src ; Skaner ; Chr(11);
Skaner = ""
End If
Waitus 1
Reset Watchdog
Incr Bufor
If Bufor = 45000 Then
Bufor = 0
Exit Do
End If
Loop
Chyba się nie zrozumieliśmy.
Do programowego UARTu dochodzą mi różne znaki od chr(0) do chr(255).
Odbieram przy pomocy Inkey(#1). Problem polega na tym że funkcja Inkey zwraca 0 w dwóch przypadkach, albo nie było znaku wogóle albo był chr(0). I właśnie nie potrafię tego rozpoznać. W sprzętowym jest to proste bo jest funkcja Ischarwaiting a w programowym kicha.
Do programowego UARTu dochodzą mi różne znaki od chr(0) do chr(255).
Odbieram przy pomocy Inkey(#1). Problem polega na tym że funkcja Inkey zwraca 0 w dwóch przypadkach, albo nie było znaku wogóle albo był chr(0). I właśnie nie potrafię tego rozpoznać. W sprzętowym jest to proste bo jest funkcja Ischarwaiting a w programowym kicha.
U mnie też do programowego dochodzą znaki od chr(0) do chr(255), przy czym chr(0) - czyli NULL, nie interesuje mnie wcale, więc czekam, aż pojawi się znak powyżej 0.
Przecież jesteś w stanie programowo odczytać wartości od 0 do 255.
Jeśli pojawi się taki znak, to albo ustawiasz flage na 1 wiedząc, że rozpoczął się jakiś komunikat i oczekujesz np: chr(13), który będzie mówił o końcu komunikatu.
Drugi sposób - uruchamiasz jakiś timerek oparty na pętli, w której zwiększasz jakiś licznik.
Jeśli odczytasz znak pozyżej 0, wówczas zerujesz licznik.
Jeśli długo nic - po osiągnięciu max wartości licznika wychodzisz z pętli twierdząc, że nie ma już nic na uarcie programowym.
Nie wiem, dlaczego uparłeś się na wartości 0 i 1. Przecież otrzymujesz je z przedziału od 0-255. No chyba, że robisz coś nie tak w programie.
Pozdrawiam
Przecież jesteś w stanie programowo odczytać wartości od 0 do 255.
Jeśli pojawi się taki znak, to albo ustawiasz flage na 1 wiedząc, że rozpoczął się jakiś komunikat i oczekujesz np: chr(13), który będzie mówił o końcu komunikatu.
Drugi sposób - uruchamiasz jakiś timerek oparty na pętli, w której zwiększasz jakiś licznik.
Jeśli odczytasz znak pozyżej 0, wówczas zerujesz licznik.
Jeśli długo nic - po osiągnięciu max wartości licznika wychodzisz z pętli twierdząc, że nie ma już nic na uarcie programowym.
Nie wiem, dlaczego uparłeś się na wartości 0 i 1. Przecież otrzymujesz je z przedziału od 0-255. No chyba, że robisz coś nie tak w programie.
Pozdrawiam
OK
przykładowo przychodzi mi nieznana ilość znaków CHR(0) , jak je mam odczytać , skoro inkey(#1) zwraca 0 zarówno gdy przyszedł CHR(0) jak i również w przypadku gdy nie było żadnego znaku?
U ciebie nie było tego problemu bo ciebie nie interesują znaki CHR(0), możesz pozwolić sobie na to że je zgubisz. Dla mnie one są wazne tak jak inne i nie mogę ich utracić.
przykładowo przychodzi mi nieznana ilość znaków CHR(0) , jak je mam odczytać , skoro inkey(#1) zwraca 0 zarówno gdy przyszedł CHR(0) jak i również w przypadku gdy nie było żadnego znaku?
U ciebie nie było tego problemu bo ciebie nie interesują znaki CHR(0), możesz pozwolić sobie na to że je zgubisz. Dla mnie one są wazne tak jak inne i nie mogę ich utracić.
Jeśli możesz , to wykorzystaj na programowy UART pin przerwania zewnętrznego i albo sprawdzaj często flagę INTx , albo odczytuj dane w przerwaniu i zapisuj do np. bufora FIFO.OK
przykładowo przychodzi mi nieznana ilość znaków CHR(0) , jak je mam odczytać , skoro inkey(#1) zwraca 0 zarówno gdy przyszedł CHR(0) jak i również w przypadku gdy nie było żadnego znaku?
U ciebie nie było tego problemu bo ciebie nie interesują znaki CHR(0), możesz pozwolić sobie na to że je zgubisz. Dla mnie one są wazne tak jak inne i nie mogę ich utracić.
Poza tym , podałes zbyta mało danych o samym programie , jak też o ewentualnej ramce danych.
Piotrek
Na podstawie odpowiedzi kolegi Piotrka - wykorzystanie pinu przerwania.
De facto uart programowy trzeba wcześniej skonfigurować, podobnie jak przerwanie.
Czy możliwym będzie skonfigurowanie pinu jednocześnie jako przerwanie i uart programowy? Z wiedzy, którą posiadam, chyba nie będzie to możliwe.
Zastanawiam się nad sytuacją podłączenia pinu nadawczego jakiegość seriala jednocześnie w opisanym pinem programowym i przerwaniem.
Konfigurujemy uart programowy i przerwanie. Zasada połączenie we/wy jest spełniona. Bezpiecznie jedno wyjście do dwóch wejść.
Wykrywamy przerwanie i w procedurze obsługi odczytujemy dane z Uarta?
Pozdrawiam.
De facto uart programowy trzeba wcześniej skonfigurować, podobnie jak przerwanie.
Czy możliwym będzie skonfigurowanie pinu jednocześnie jako przerwanie i uart programowy? Z wiedzy, którą posiadam, chyba nie będzie to możliwe.
Zastanawiam się nad sytuacją podłączenia pinu nadawczego jakiegość seriala jednocześnie w opisanym pinem programowym i przerwaniem.
Konfigurujemy uart programowy i przerwanie. Zasada połączenie we/wy jest spełniona. Bezpiecznie jedno wyjście do dwóch wejść.
Wykrywamy przerwanie i w procedurze obsługi odczytujemy dane z Uarta?
Pozdrawiam.
Dlaczego...Z wiedzy, którą posiadam, chyba nie będzie to możliwe.
Np. taki szkielet
Kod: Zaznacz cały
$regfile = "m8def.dat"
Config Int0 = Falling
On Int0 Get_swuart
Dim B1 As Byte
Open "comd.2:19200,8,n,1" For Input As #1
'dwie poniższe linie nie wydają mi się konieczne , ale dla świętego spokoju ...
Reset Ddrd.2
Set Portd.2
'main
Get_swuart:
B1=Inkey(#1)
'zapis do bufora , itd.
Set Gifr.intf0
Return
Ideałem była by , własna procedura w assmblerze .
Piotrek
mam wrażenie że te przerwania będą w róznych momentach, nie zawsze na początku transmisji znaku. I jeszcze jedno, jeśli zacznie się transmisja pierwszego znaku to natychmiast powstanie przerwanie i nastąpi próba odczytu znaku, tymczasem jego jeszcze tam nie będzie.Trzeba chyba zrobić jakieś wait, ale musiałoby być idealnie dobrane. Boje sie że nastąpi rozsynchronizowanie transmisji.
Ale pomysl ciekawy - spróbuje w praktyce.
Ale pomysl ciekawy - spróbuje w praktyce.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 40 gości