Witam wszystkich.
Mam urządzenie (AVR+bascom) które wysyła po rs'ie dane o ogólnie rzecz mówiąc stanie czujników, podzespołów.
Dane odbierane w terminalu wyglądają jak poniżej:
przy czym kolejność i częstość występowania komunikatów i ich długość są różne (od 7..8 znaków do 37).
Używając terminala wszystko działa jak należy (pod kątem takiej komunikacji pisałem program dla AVRa), natomiast sprawa komplikuje
się przy odfiltrowaniu poszczególnych linijek w Delphi 7.
Przykładowo fragment:
(używam CreateFile)
Ale .. jest to do kitu. Taki algorytm nie daje sobie dobrze rady z rozdzielaniem komunikatów, także zawiesza się po kilku, kilkunastu sekundach. Próbowałem wielu kombinacji pętli if + repeat lub while..
.. i nie umiem sobie z tym poradzić, by każda linijka wysyłanego komunikatu trafiała do odpowiedniej label.
Może lepszym rozwiązaniem byłoby zapełnianie bufora do znaku wystąpienia EOL (13,10) i czyszczenie w celu ponownego zapełniania?
- a między czasie przetworzenie bufora..
Tylko jak to zrobić.. ?
A może trzeba do rzeczy podejść zupełnie inaczej - przepisać bascomowy program tak, aby dopiero po zapytaniu (z PC) AVR odpowiadał - wysyłając odp. komunikat.. Tak chyba byłoby najprościej, ale wtedy
stracę możliwość ciągłego odbierania w terminalu.
Wolałbym filtrować te dane na wejściu - tylko nie wiem jak się zabrać za to od innej strony ?
Liczę na Wasze doświadczenie i prosiłbym o skierowanie mojego toku myślenia w prawidłowym kierunku.
Mam urządzenie (AVR+bascom) które wysyła po rs'ie dane o ogólnie rzecz mówiąc stanie czujników, podzespołów.
Dane odbierane w terminalu wyglądają jak poniżej:
W:sterownik v5.14 - 05.12.11
U:6.12V
I:42.0
H:poziomo - poza zakresem
h:0
V:pionowo - poza zakresem
v:0
V:pionowo - w górę
v:9
U:6.15V
I:43.75
V:pionowo - w górę
v:79
U:6.15V
I:39.5
H:poziomo - w lewo
h:19
V:pionowo - w górę - dalej nie można
v:80
U:6.15V
I:42.75
H:poziomo - w lewo - dalej nie można
h:84
V:pionowo - w górę
v:79
U:6.20V
I:zbyt ciemno
U:6.20V
U:6.20V
R:PC - w lewo
U:6.23V
przy czym kolejność i częstość występowania komunikatów i ich długość są różne (od 7..8 znaków do 37).
Używając terminala wszystko działa jak należy (pod kątem takiej komunikacji pisałem program dla AVRa), natomiast sprawa komplikuje
się przy odfiltrowaniu poszczególnych linijek w Delphi 7.
Przykładowo fragment:
(używam CreateFile)
var
bufodb:array[0..95] of char;
bufW: array[0..47] of char;
bufI: array[0..47] of char;
{prędkość= 9600bps, 1 startu, 1 stopu, brak parzystości
czyli 1200Bps , dla użytkownika 1200 * 8/10 = 960 (na 1 sek)
wątek lub timer co 100 ms
}
begin
zeroMemory(@bufodb,SizeOf(bufodb));
ClearCommError(hCOM,Errors,@ComStat);
if ComStat.cbInQue>0 then
ReadFile(hCOM,bufodb,ComStat.cbInQue,nrRead,nil);
repeat
if bufodb[i]='W' then begin
i:=i+2;
a:=0;
repeat
bufW[a]:=bufodb[i];
inc(a);
inc(i);
until bufodb[i]=#13;
end;
if bufodb[i]='I' then begin
i:=i+2;
a:=0;
repeat
bufI[a]:=bufodb[i];
inc(a);
inc(i);
until bufodb[i]=#13;
end;
form1.Label1.Caption:=bufW;
form1.Label2.Caption:=bufI;
end;Ale .. jest to do kitu. Taki algorytm nie daje sobie dobrze rady z rozdzielaniem komunikatów, także zawiesza się po kilku, kilkunastu sekundach. Próbowałem wielu kombinacji pętli if + repeat lub while..
.. i nie umiem sobie z tym poradzić, by każda linijka wysyłanego komunikatu trafiała do odpowiedniej label.
Może lepszym rozwiązaniem byłoby zapełnianie bufora do znaku wystąpienia EOL (13,10) i czyszczenie w celu ponownego zapełniania?
- a między czasie przetworzenie bufora..
Tylko jak to zrobić.. ?
A może trzeba do rzeczy podejść zupełnie inaczej - przepisać bascomowy program tak, aby dopiero po zapytaniu (z PC) AVR odpowiadał - wysyłając odp. komunikat.. Tak chyba byłoby najprościej, ale wtedy
stracę możliwość ciągłego odbierania w terminalu.
Wolałbym filtrować te dane na wejściu - tylko nie wiem jak się zabrać za to od innej strony ?
Liczę na Wasze doświadczenie i prosiłbym o skierowanie mojego toku myślenia w prawidłowym kierunku.