информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный сбой Azure и других сервисов... 
 Серьезный сбой AWS положил множество... 
 Фишинговая атака на Python-разработчиков 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Убери PurgeComm. Я не стал полностью разбиратся с сырцом -... 25.01.04 21:12  Число просмотров: 2002
Автор: 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'ом ты их удаляешь. И вообще зачем ты его тут поставил?
<programming>
[Win32] COMPort - ошибки в пакетах. 24.01.04 00:46  
Автор: Wud <Леха> Статус: Member
<"чистая" ссылка>
Вот кусок кода чтения порта.
Ну само собой понятно провели нициализацию... бла бла бла...
Запустили в отдельном потоке чтение данных из порта.
Все читает просто великолепно, но... не совсем...
Все бы то хорошо, но при определенном пакете в 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. Тут точно никакой опечатки нет?

> end;//while
> StrResult:=S;
> end;//while
> end;//begin
Убери 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'ом ты их удаляешь. И вообще зачем ты его тут поставил?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach