Skocz do zawartości

RS232 - rozróżnianie zmiennych, jak?


Kaytec

Pomocna odpowiedź

Witam. Potrzebuje pomocy.

Cel jest krótki i niektórym znany : sterować dwoma silnikami i dwoma przekaźnikami przez RS232

Zamierzam wysłać dwie zmienne typu 0-255 i dwa znaki np. 1-0. Problem mam taki że nie wiem jak je wysłać i odebrać w programie (Bascom), żeby procek je rozróżniał. Czyli widział że A=125 B=255 C=1 D=0.

Nadajnik:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Serialin = Buffered , Size = 50
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5


Dim Pot1 As Byte
Dim Pot2 As Byte


Print "Program testowy"

Do
Print Pot1
Print Pot2



Incr Pot1
Decr Pot2


Waitms 200


Loop
End

Odbiornik znaków ascii - podręcznikowy przykład:


$regfile = "m8def.dat"

$crystal = 8000000

$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

Config Serialin = Buffered , Size = 50
Dim Znak As String * 1
Dim Poz As Byte
Enable Interrupts
Cls
Poz = 1
Do
Znak = Inkey()
If Asc(znak) > 31 Then
If Poz = 17 Then
Cls
Poz = 1
End If
Lcd Znak
Incr Poz
End If
Waitms 100
Loop
End

Co do włączania i wyłączania przekaźników to rozwiązałem to tak:

If Asc(znak) = 49 Then
Portb.4 = 0
Elseif Asc(znak) = 50 Then
Portb.4 = 1

Co oczywiście działa, ale sprowadza się tylko do włącz/wyłącz.

Ale nadal nie wiem jak wysłać zmienną tak żebym widział że A=125 B=255 C=1 D=0.

Pozdrawiam.

Link do komentarza
Share on other sites

Wysyłaj ramkę danych. Czym krótsza tym prościej. W ogólności:

- najpierw wysyłasz znak (lub kilka znaków) początku ramki, o wzorze dość charakterystycznym

- wysyłasz wąłściwą wiadomość, czyli np. komendę i wartosci

- (opcjonalne, ale zalecane, szczególnie dla długich ramek) wysyłasz sume kontrolną bądź dowolny symbol kontrolny

- wysyłasz znak końca ramki

Jeśli korzystasz z ASCII może to np wyglądać tak:

/cmd 078 105 P P[znak powrotu karetki][znak przejścia do nowej linii]

czyli jazda obu kół do przodu, jedno na 78 drugie na 105. Jak widać komenda jest długa (19 znaków), ale przy sterowaniu z konsoli to nie problem.

Link do komentarza
Share on other sites

O ile wysłanie takiej ramki nie stanowi żadnego problemu, zarówno na atmega jak i z terminala. To kompletnie nie wiem jaką funkcją w bascomie to odczytać.

Chodzi mi o to że, z moimi umiejętnościami bascoma musiałbym napisać 65025 ifów sprawdzających wszystkie kombinacje tych dwóch wartości 😉

Jak zrobić żeby AVR wiedział że pierwsze 3 znaki to A drugie 3 to B itd.

Link do komentarza
Share on other sites

Jak? Najpierw sprawdzasz czy w ramce wszystko jest na swoim miejscu, jeśli nei, to najprościej zignorować ramkę. Potem wg miejsca w ramce przypisujesz wartości, pamiętając jak są kodowane cyfry w ASCII.

Np:

A = (ramka[5]-48)*100 + (ramka[6]-48)*10+ramka[7]-48;

B = (ramka[9]-48)*100 + (ramka[10]-48)*10+ramka[11]-48;

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

🙂 Genialne. Już sprawdzam w praktyce.

[ Dodano: 01-11-2010, 19:42 ]

Ech.. Jak poprawnie użyć instrukcji inputbin w bascomie. Cały czas wywala mi błędy o nieodpowiedniej składni.

Link do komentarza
Share on other sites

Jak poprawnie użyć instrukcji inputbin w bascomie.

Zaczerpnięte z helpa:

Składnia:

INPUTBIN zmienna1 [, zmienna2] [, il_bajtów]

INPUTBIN #kanał , zmienna1 [, zmienna2] [, il_bajtów]

gdzie:

zmienna1 dowolna zmienna do której wpisane będą odebrane znaki,
zmienna2 opcjonalnie - następna zmienna (i dalsze) do której wpisane będą odebrane znaki,
kanał numer kanału przy korzystaniu z programowego lub sprzętowego układu UART.

il_bajtów ilość wymaganych bajtów do odczytu

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Wielkie dzięki panowie udało się. Jedyny problem to to że bascom nie toleruje nawiasów i musiałem obliczenia rozpisać.

$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000

Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim Wartosc1 As Word
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Serialin = Buffered , Size = 50
Enable Interrupts

Cls

Do

Inputbin A , 1

Inputbin B , 1

Inputbin C , 1

A = A - 48
A = A * 100
B = B - 48
B = B * 10
C = C - 48

A = A + B
A = A + C

Wartosc1 = A

Lcd Wartosc1
Lcd "test"

Wait 1
Cls
Loop
End

Program dla ramki o trzech znakach ASCII od 0-9 wysyłamy (0-255).

Jeszcze raz wielkie dzięki za pomoc.

[ Dodano: 02-11-2010, 15:15 ]

Kolejne pytanie. Jak napisać bascomowi funkcje sprawdzania czy nadawana jest kolejna instrukcja?

Chodzi o to żeby silniki pracowały np przez 100ms po podaniu wysłaniu parametrów. I jeżeli parametry są wysyłane to kontynuuj pracę, a jeżeli nic nie jest nadawane to silniki na 0.

Link do komentarza
Share on other sites

Kaytec, to można włączyć silniki + sprawdzać czy coś przyszło i np w przerwaniu timerka sprawdzać co 100ms czy zmienna, do której zapisujesz instrukcje zawierą tę instrukcję czy nie - jeśli nie, to wyłączasz silniki. tylko trzeba by gdzieś wsadzić wyczyszczenie tej zmiennej.

Link do komentarza
Share on other sites

Tak, tylko że funkcja Inputbin cały czas czeka aż przyjdzie znak i dopiero jak przyjdzie to przypisuje ją do zmiennej i kontynuuje program. Inaczej program stoi.

Do
Inputbin A
Inputbin B

Lcd A
Lcd B

Wait 1
Cls


loop




Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.