Jak rozpoznać koniec łańcucha

0

witam
ciagle mecze sie z rs232, przeszukałem chyba juz całe forum.
Wysylam mikrokontrolerem dane w postaci 10bajtow czyli 2 temperatury.
Odbieram je przez rs232 komponentem COMPORT poleceniem ComPort.ReadStr(Str, Count); tutaj str to zmienna string czyli łańcuch. Problem w tym ze nie wyswietla mi tego prawidlowo w delphi, przypuszczam ze musze przez mikrokontroler wyslać znak konca łańcucha. Przypuszczam ze musi byc to null lub 0 ale jak mam odczytać ten znak konca łancucha w delphi skoro dane sa odczytywane z portu jako string. Moze da sie odczytać wiadomości z portu jakoś bitowo a nie łańcuchowo. Kto mi pomoże? Jak mam to poprawnie skomunikować, Tylko prosze mnie nie odsyłać do książki rs232 praktyczne programowanie bo tam jest lipa, same krzaki.

0

Zero to konwencja języka C, Pascal woli 13 (CR). Ale z drugiej strony Windows jest bardziej C-owe.
Ja zbierałbym po znaku, rozpoczynając ramkę jakimś spec znakiem (np. @) i oczekując, że po określonej liczbie znaków wystąpi jakiś (lepiej inny, np. CR) spec znak.
Wygodnie może być żeby zawsze ramka miała tyle samo znaków (co może komplikować trochę życie mikrokontrolerka), ale nie jest to konieczne. Przy transmisji przydaje się jakaś suma kontrolna (a czy twój termometr nie daje takiej?).

0

Jesli wysylasz takie dane w formacie binarnym, to musisz to obudowac w jakas ramke, ktora mozna jednoznacznie rozpoznac (np dodac jakies CRC). W koncu znakiem specjalnym moze byc tez twoja temperatura i co wtedy ?

Z RS najprosciej przesylac temperature w postaci tekstowej i zakanczac to znakim CR lub CR i LF.
Oczywiscie traci sie na szybkosci .... ale RS to i tak nie jest szybki.

0
reichel napisał(a)

Jesli wysylasz takie dane w formacie binarnym, to musisz to obudowac w jakas ramke, ktora mozna jednoznacznie rozpoznac (np dodac jakies CRC). W koncu znakiem specjalnym moze byc tez twoja temperatura i co wtedy ?

Z RS najprosciej przesylac temperature w postaci tekstowej i zakanczac to znakim CR lub CR i LF.
Oczywiscie traci sie na szybkosci .... ale RS to i tak nie jest szybki.

hmm w tym wlasnie problem z przesylaniem przez rs232 jako string. czy moglbys mi podac jak to ma wygladac zaczynajac od polecenia ComPort.ReadStr(Str, Count); Nie wychodzi mi to. wysylam na rs dane tak 23.4 34.3\0 .czyli \0to bedzie ten znak końca

0

Witaj.
Spróbuj wykorzystać SerialNG http://www.domis.de/cms/modules.php?op=modload&name=News&file=article&sid=13
bardzo prosty w oprogramowaniu i nie ma problemu z odczytaniem stringa, metoda SerialPortNG1.ReadNextClusterAsString zwraca odebrane dane jako string. Powiedz czy twój mikrokontroler "sypie" sam danymi czy Ty go odpytujesz ?
Pozdrawiam hej

0
keinxor napisał(a)

Witaj.
Spróbuj wykorzystać SerialNG http://www.domis.de/cms/modules.php?op=modload&name=News&file=article&sid=13
bardzo prosty w oprogramowaniu i nie ma problemu z odczytaniem stringa, metoda SerialPortNG1.ReadNextClusterAsString zwraca odebrane dane jako string. Powiedz czy twój mikrokontroler "sypie" sam danymi czy Ty go odpytujesz ?
Pozdrawiam hej

sam sypie danymi co ok sekunde nie wysylam mu zadnego sygnału.

0

ComPort ma zdarzenia - zainteresuj się (chyba) OnRx. Jutro w pracy podeślę Ci jak to się prosto robi.
BTW musisz wysyłać jakiś znak oznaczający koniec ramki, może to być np. EOT $04 - w brew pozorom wszystkie znaki "zapisują" się w stringu (no poza $00 bo on oznacza jego koniec)
BTW2 ComPort ma bardzo fajny help - polecam

0

tu przyklad kodu bezposredni w win api (kompilowane w delphi, mozna sklecic komponent) + mikroproc z kodem w bascom

http://rudy.mif.pg.gda.pl/~reichel/showcat.php?id=14

generalnie wiekszosc komponentow posiada opcje odebrania tekstu ?!

0

dzieki jakos sobie poradzilem. odbieram bajt po bajcie i wychodzi 23.4 a oraz 23.6
na przyszlosc dla kogos podaje kod:

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer); //wyswietlanie danych z rs232
var
rx:array[1..255] of byte;

begin
if ComPort.Connected then begin
ComPort.SetRTS(True); // set RTS to high
ComPort.SetRTS(False); // lower RTS signal

 sleep (250); //czekaj na atr
 count := 5; // dlugosc odczytanych znakow z portu rs232
 comport.Read(rx,count);   //odczyt bajt po bajcie z rs232 (count ilosc bajtow)

Memo1.Lines.add(inttostr(rx[1]-40)+'.' +inttostr(rx[2]-1)); //wyswietlanie w komponencie memo
memo2.lines.add(inttostr(rx[3]-40)+'.'+inttostr(rx[4]-1));
end.

dzieki wszystkim za pomoc jednoczesnie zamykam temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0