Убери PurgeComm. Я не стал полностью разбиратся с сырцом -...25.01.04 21:12 Число просмотров: 1967 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 25.01.04 21:15 Количество правок: 2
> ReadFile(ComHandle,s[1],Kols,Kols,@Ovr); > PurgeComm(ComHandle,PURGE_RXCLEAR); Убери PurgeComm. Я не стал полностью разбиратся с сырцом - но PurgeComm очищает буфер и возможно сразу после выполнения ReadFile в буфере появляются нужные тебе байты но этим PurgeComm'ом ты их удаляешь. И вообще зачем ты его тут поставил?
Вот кусок кода чтения порта.
Ну само собой понятно провели нициализацию... бла бла бла...
Запустили в отдельном потоке чтение данных из порта.
Все читает просто великолепно, но... не совсем...
Все бы то хорошо, но при определенном пакете в StrResult мне пишется срань, хотя я уверен что получаю целый пакет.
Шлю данные по байтно. Для ясности привожу в HEXe.
Из девайса: $02$0A$01$00$00$01$00$00$07$ED$7D$49$FE (хочу это и видеть в StrResult)
Получаю: $02$0A$01$00$00$01$00$00$07$ED}G$FE
Весь пакет 13байт, но вот в данном случае мне приходит огрызок неясного содержания.
Причем другие пакеты такой же длинны, но чуть иного содержания читаются целиком без проблем.
-
может это и бага девайса, но как лечить?
самое обидное, что прога от поставщика девайса данный кусок читает на ура.
Что делать?
var
ComHandle:Integer;
Ovr:TOverlapped;
Stat:TComStat;
Kols,TransMask,Errs:DWord;
StrResult:String;
procedure WComRead;
var
s:string;
i:integer;
b:byte;
begin
//
while true do begin
TransMask:=0;
WaitCommEvent(ComHandle,TransMask,nil);
s := '';
If (TransMask and EV_RXFLAG)<>0 then Continue;
ClearCommError(ComHandle,Errs,@Stat);
If Stat.cbInQue<>0 then else Continue;
Kols:=Stat.cbInQue;
s:='';
SetLength(s,Kols);
//
ReadFile(ComHandle,s[1],Kols,Kols,@Ovr);
PurgeComm(ComHandle,PURGE_RXCLEAR);
//
i := 1;
while i <= Length(s) do begin
if (s[i] < #32) or (s[i] >= #128) then begin
b := byte(s[i]);
Delete(s, i, 1);
Insert('$'+IntToHex(b, 2), s, i);
end;//if
inc(i);
end;//while
StrResult:=S;
end;//while
end;//begin
[Win32] Для большей ясности26.01.04 11:46 Автор: amirul <Serge> Статус: The Elderman
Было бы интересно узнать, что записано в WaitCommMask, а также в EventChar.
> Вот кусок кода чтения порта. > Ну само собой понятно провели нициализацию... бла бла > бла... > Из девайса: $02$0A$01$00$00$01$00$00$07$ED$7D$49$FE (хочу > это и видеть в StrResult) > Получаю: $02$0A$01$00$00$01$00$00$07$ED}G$FE
> i := 1; > while i <= Length(s) do begin > if (s[i] < #32) or (s[i] >= #128) then begin > b := byte(s[i]); > Delete(s, i, 1); > Insert('$'+IntToHex(b, 2), s, i); А вообще ошибка здесь
> end;//if > inc(i); и здесь. На $ED срабатывает условие, после чего вставляется 3 символа в позицию i, а i увеличивается на 1. Я паскаль плохо знаю (может я и ошибаюсь), но я бы присмотрелся именно к этому месту. Строку, которая растет лучше разбирать или с конца или в другую строку.
Только что пересмотрел результат. Все обработалось нормально. Вышеописанный баг незаметен потому, что вставляются символы с печатными кодами (которые не проходят условие). А символы "}G" тоже не проходят условие. Только это коды 0x7d 0x47, а не 49. Тут точно никакой опечатки нет?
Убери PurgeComm. Я не стал полностью разбиратся с сырцом -...25.01.04 21:12 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 25.01.04 21:15 Количество правок: 2
> ReadFile(ComHandle,s[1],Kols,Kols,@Ovr); > PurgeComm(ComHandle,PURGE_RXCLEAR); Убери PurgeComm. Я не стал полностью разбиратся с сырцом - но PurgeComm очищает буфер и возможно сразу после выполнения ReadFile в буфере появляются нужные тебе байты но этим PurgeComm'ом ты их удаляешь. И вообще зачем ты его тут поставил?