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?

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

UART programowy - jak rozpoznać że jest znak?

Postautor: Fredy » 11 wrz 2007, o 12:25

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

RcTomek
-
-
Posty: 357
Rejestracja: 18 lip 2005, o 17:28
Lokalizacja: Głogów / Wrocław

Postautor: RcTomek » 11 wrz 2007, o 16:48

W tym celu wykorzystaj zmienną ERR, którą Bascom tworzy automatycznie. Zmienna ta zwraca 1, gdy wystąpi błąd (w tym przypadku nieodebranie znaku poprzez Inkey(#1)). Dzięki temu można odróżnić czy odebrano znak 0 czy też nie.

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

Postautor: Fredy » 14 wrz 2007, o 22:27

Sprawdziłem ale niestety zmienna ERR nie reaguje na to czy funkcja Inkey(#1) napotka znak. Zawsze ERR=0.
Ale dzięki za pomysł.
Może ktoś ma jakiś inną sugestie?

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

Postautor: Fredy » 26 wrz 2007, o 22:33

Nie ma ktoś jakiegoś innego pomysła? :607:

Awatar użytkownika
almatea
-
-
Posty: 240
Rejestracja: 12 gru 2003, o 17:02
Lokalizacja: Brzeszcze
Kontaktowanie:

Postautor: almatea » 27 wrz 2007, o 10:37

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

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

Postautor: Fredy » 27 wrz 2007, o 16:40

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

Awatar użytkownika
almatea
-
-
Posty: 240
Rejestracja: 12 gru 2003, o 17:02
Lokalizacja: Brzeszcze
Kontaktowanie:

Postautor: almatea » 28 wrz 2007, o 13:59

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

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

Postautor: Fredy » 28 wrz 2007, o 17:11

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

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 29 wrz 2007, o 13:54

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ć.
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.
Poza tym , podałes zbyta mało danych o samym programie , jak też o ewentualnej ramce danych.

Piotrek

Awatar użytkownika
almatea
-
-
Posty: 240
Rejestracja: 12 gru 2003, o 17:02
Lokalizacja: Brzeszcze
Kontaktowanie:

Postautor: almatea » 29 wrz 2007, o 19:01

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.

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 30 wrz 2007, o 14:19

...Z wiedzy, którą posiadam, chyba nie będzie to możliwe.
Dlaczego :?:
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
Nie testowałem takiego czegoś w Bascom-ie , ale w C działa.Poza tym , na przerwaniu bez Nosave , można nie osiągnąć jakiś wielkich szybkości , ale można spróbować :)
Ideałem była by , własna procedura w assmblerze .

Piotrek

Fredy
-
-
Posty: 141
Rejestracja: 27 mar 2005, o 21:45
Lokalizacja: Małopolska

Postautor: Fredy » 2 paź 2007, o 17:06

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

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 108 gości