информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Убери 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'ом ты их удаляешь. И вообще зачем ты его тут поставил?
<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