Skocz do zawartości

RS232 - rozróżnianie zmiennych, jak?


Pomocna odpowiedź

Napisano

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.

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.

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.

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

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

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

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.

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.

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




Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...