komunikacja przez rs z urządzeniami elektronicznymi
Masz problem? Zapytaj na forum elektroda.pl
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: komunikacja przez rs z urządzeniami elektronicznymi
Date: Wed, 15 Dec 2004 15:23:07 +0100
Czy może mi ktoś pomóc w kwestii komunikacji mojego urządzenia z
procesorem 89s53 z komputerem? Komunikacja w ogóle działa czyli z
terminala coś wysyłam procek odbiera i wykonuje polecnie albo odpowiada.
Zrobiłem to na przerwaniach i działa całkiem nieźle. Zupełnie nie koliduje
z programem głównym. Ale mam problem z interpretacją danych. Np. moje
urządzenie ma zegar i chciałbym go ustawiać z komputera. Jak to zrobić?
Jak wysłać coś co będzie jednoznaczne i da się prosto rozebrać na
polecenie i dane a dodatkowo będzie pewne, że nie ma przekłamania. Wiem,
że trzeba przyjąć jakąś ramkę transmsji. Ale nie mam pomysłu jak. Chciałem
zrobić cos na wzór ModBusa ale moim zdaniem procedura analizy będzie
skomplikowana. Ma ktos jakiś sprawdzony sposób?
Pozdrawiam
PC
p.s.
Program na peceta sam sobie napiszę.
From: Maksymilian Dutka <maxdutka_at_nospam_usunonet.pl>
Subject: Re: komunikacja przez rs z =?ISO-8859-2?Q?urz=B1dzeniami_elekt?=
Date: Wed, 15 Dec 2004 15:39:06 +0100
Pablo C napisał(a):
Czy może mi ktoś pomóc w kwestii komunikacji mojego urządzenia z
procesorem 89s53 z komputerem? Komunikacja w ogóle działa czyli z
terminala coś wysyłam procek odbiera i wykonuje polecnie albo odpowiada.
Zrobiłem to na przerwaniach i działa całkiem nieźle. Zupełnie nie koliduje
z programem głównym. Ale mam problem z interpretacją danych. Np. moje
urządzenie ma zegar i chciałbym go ustawiać z komputera. Jak to zrobić?
Jak wysłać coś co będzie jednoznaczne i da się prosto rozebrać na
polecenie i dane a dodatkowo będzie pewne, że nie ma przekłamania. Wiem,
że trzeba przyjąć jakąś ramkę transmsji. Ale nie mam pomysłu jak. Chciałem
zrobić cos na wzór ModBusa ale moim zdaniem procedura analizy będzie
skomplikowana. Ma ktos jakiś sprawdzony sposób?
Jeżeli nie ma być na 99% przekłamań to będzie ciężko, wtedy trzeba się
bawić w CRC itp. Jeżeli poprawność transmisji nie jest aż tak ważna to
proponuje tak:
1) wysłać jakąś unikalną liczbę (sekwencję liczb), będzie to znak dla
mikrokontrolera że zacząła się "ramka"
2) teraz wysyłasz informację o tym co np. będziesz ustawiał
3) wysyłasz kolejne liczby coś ustawiające, ich znaczenie będzie
wynikało z punktu 2.
--
Pozdrawiam
Maksymilian Dutka
-------
GG: 1493163
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: komunikacja przez rs z urządzeniami elektronicznymi
Date: Wed, 15 Dec 2004 16:01:56 +0100
Musi być kontrola poprawoności. Myślałem aby sumować modulo poszczególne
znaki wysyłanego ciągu.
Teraz pytanie skąd procesor ma wiedzieć jaką wartość wysyłam. Wartość może
być 1 a może być 123456. Czyli ramka mialaby zmienną długość. Z kolei jak
będzie miała stałą długość to trzebaby jakoś analizować jej treść i usuwać
np zera. Wolałbym aby pecet robił większość a procesor tylko to co
konieczne.
PC
From: Waldemar Krzok <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: komunikacja przez rs z =?ISO-8859-2?Q?urz=B1dzeniami?= elektronicznymi
Date: Wed, 15 Dec 2004 16:29:50 +0100
Pablo C wrote:
Musi być kontrola poprawoności. Myślałem aby sumować modulo poszczególne
znaki wysyłanego ciągu.
Teraz pytanie skąd procesor ma wiedzieć jaką wartość wysyłam. Wartość może
być 1 a może być 123456. Czyli ramka mialaby zmienną długość. Z kolei jak
będzie miała stałą długość to trzebaby jakoś analizować jej treść i usuwać
np zera. Wolałbym aby pecet robił większość a procesor tylko to co
konieczne.
a nie możesz dać stałej ramki? Wysyłasz np. zawsze 8 bajtów na zapas. Inna
możliwość to wysłanie nagłówka z kodem informacji i CRC, i miproc "wie" ile
bajtów musi jeszcze odebrać.
Waldek
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: komunikacja przez rs z urządzeniami elektronicznymi
Date: Wed, 15 Dec 2004 16:45:45 +0100
Właśnie trochę przeraża mnie długośc ramki bo ja operuję głównie na
liczbach 4-bajtowych. Może by to przesyłać w hex-ach? Bajt to zawsze 2
znaki najwyżej najstarsze będą zerowe.
Czyli przyjąć ramkę np:
P HH HH HH HH CC
- początek transmisji
P - komenda
HH - poszczególne bajty danej
CC - suma kontrolna z :P HH HH HH HH
PC
From: Waldemar Krzok <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: komunikacja przez rs z =?ISO-8859-2?Q?urz=B1dzeniami?= elektronicznymi
Date: Wed, 15 Dec 2004 17:29:31 +0100
Pablo C wrote:
Właśnie trochę przeraża mnie długośc ramki bo ja operuję głównie na
liczbach 4-bajtowych. Może by to przesyłać w hex-ach? Bajt to zawsze 2
no pewnie, że nie w ASCII, oszczędzisz pół wiadra bajtów.
znaki najwyżej najstarsze będą zerowe.
Czyli przyjąć ramkę np:
P HH HH HH HH CC
- początek transmisji
P - komenda
HH - poszczególne bajty danej
CC - suma kontrolna z :P HH HH HH HH
albo robisz tak, jak ja robię:
pierwszy znak to komenda. Aby było wiadomo, że to pierwszy znak, ma
ustawioną 1 na MSB (czyli komendy mają kody od 0x80 do 0xFF). Potem lecą
wartości i CRC kodowane tak, by się w 7 bitach mieściły. Mam to tak: 7
bajtów danych kastruję z MSB i pakuję je w ósmy bajt pozostawiając w nim
msb = 0. Potem CRC ze wszystkiego, trzeba tylko uważać, by CRC było >= 0 i
< 128.
Waldek
From: "Q" <oink_at_nospam_gazeta.gov.pl>
Subject: Re: komunikacja przez rs z urządzeniami elektronicznymi
Date: Wed, 15 Dec 2004 17:34:44 +0100
urządzenie ma zegar i chciałbym go ustawiać z komputera. Jak to zrobić?
mozna na tysiac sposobow :)))
zrobić cos na wzór ModBusa ale moim zdaniem procedura analizy będzie
wiesz co to modbus
i nie potrafisz sam obczajic jakiegos wlasnego protokolu?!
(!?)
dziwne...
no nic;
mozesz zrobic np. tak:
wysylasz ramki, pierwszy bajt to dlugosc ramki,
kolejny to np. rozkaz, a nastepne to np. dane :),
mozesz na koncu dac jakis crc;
mozesz tez np. wysylac ramki jako stringi (nie mylic z gaciami) ascii;
i np bajt o wartosci 0 - to koniec ramki,
a jakis nie-znak (np. CR) mozesz dac jako start bajt;
/np. cos ala komendy AT.......
hm...
mozesz tez np. start i koniec oznaczac jakas sekwencja bajtow,
np. start to 00 01 a koniec to 00 02,
ale wtedy musisz dbac o poprawnosc rozpoznawania danych;
/np. jesli przed traktowac 00 00 jako jeden bajt 00;
..........
mozesz tez np. znalezc koniec i poczatek ramki
z zaleznosci czasowych, jakie sobie zalozysz.......
Boze......
od cholery tego!
/ale zadales pytanie......
)
From: Mariusz Dybiec <mardyb_at_nospam_poczta.onet.pl>
Subject: Re: komunikacja przez rs z =?ISO-8859-2?Q?urz=B1dzeniami_elekt?=
Date: Wed, 15 Dec 2004 19:25:48 +0100
Pablo C wrote:
Czy może mi ktoś pomóc w kwestii komunikacji mojego urządzenia z
procesorem 89s53 z komputerem? Komunikacja w ogóle działa czyli z
terminala coś wysyłam procek odbiera i wykonuje polecnie albo odpowiada.
Zrobiłem to na przerwaniach i działa całkiem nieźle. Zupełnie nie koliduje
z programem głównym. Ale mam problem z interpretacją danych. Np. moje
urządzenie ma zegar i chciałbym go ustawiać z komputera. Jak to zrobić?
Jak wysłać coś co będzie jednoznaczne i da się prosto rozebrać na
polecenie i dane a dodatkowo będzie pewne, że nie ma przekłamania.
Możliwości masz wiele np:
1 Wysyłasz łańcuchy ASCII między znakiem początku i końca (ew jeszcze
czeksuma chćby suma modulo256) i znak końca linii CR . Np
[01E1=4095]E7CR gdzie kolejno początek ramki, adres urządzenia, parametr
i wpisywana wartość, koniec ramki, suma w postaci dwóch znaków ASCII dla
dwóch półbajtów, znak CR czyli 0DH. Dodatkowo po prawidłowym odebraniu
paczki procek może odsyłać tę wartość jako potwierdzenie. Trochę obróbki
potrzebne do zmiany z dec na bin ale przydatne jak chcesz urządzenie
sterować z terminala i widzieć jakie nastawy są w twoim urządzeniu.
2 Wysyłasz tekstowo ramkę z początkiem i ew końcem a w środku bajty -
każdy jako dwa znaki ASCII np [01E7DB3C]. Przy odbiorze odrzucasz znaki
sterujące, od znaków ASCII odejmujesz 30H i masz półbajty binarnie.
Prościej się nie da - można ew pokomplikować dodając czeksumę.
3 Binarny - najmniej znaków ale najwięcej problemów. Najlepiej zrób
sobie Modbusa RTU bo bez sensu narobić się nad protokołem którego nikt
nie stosuje a tak masz już potem gotowca :)
--
Pozdrawiam
MD
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: komunikacja przez rs z urządzeniami elektronicznymi
Date: Wed, 15 Dec 2004 19:40:00 +0100
Dzięki za wszystkie rady i sugestie. Głównie miałem problem z różną
długoscią (w znakach) danych liczbowych. Teraz zamieniam wszystko na HEX-a
i jest ok. Zaczynam transmisję od ":" i kontroluję sumę poszczególnych
znaków odrzucając przeniesienia. Tyle mi wystarczy do kontroli transmisji.
Tak myślę. Teraz czas na testy :)
Pozdrawiam
PC