Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

Чтение из com-порта...   Найти похожие ветки 

 
Mr.Nobody   (2003-11-25 22:17) [0]

Помогите чайнику...
Я пишу в com-порт некий запрос, а устройство на этом порту шлет мне ответ. Проблема в следующем: заранее не известно, какой длины будет этот ответ. Вопрос соответственно: можли ли узнать эту длину перед чтение. Сейчас делаю так: читаю посимвольно до наступления timeout"а...


 
Evgeny V ©   (2003-11-26 06:03) [1]

Правильно делаешь, если нет заранее известного размера ответа. Можно не посимвольно, а сразу все что пришло, до наступления тайм-аута. Хотя если устройство твое, то лучше бы какой бы протокольчик организовать, но наверное не твое


 
Mr.Nobody   (2003-11-26 11:34) [2]

Нет, устройство не мое... ну всмысле мое... разработка не моя.
Я просниферил как с этим устройством общается другая прога. Ну так вот она после каждой записи в порт посылает запрос IOCTL_SERIAL_GET_COMMSTATUS и тока потом читает. Мне почему-то кажется что по этому запросу и определяется длина данных, которые готовы к прочтению. Поискал про этот запрос в MSDN - ничего внятного, все ссылки на DDK, а драйвер писать у меня чо-то желания нет. Кто-нить чо-нить про этот запрос знает?


 
MaxDDinc   (2003-11-26 19:59) [3]

Доброго времени суток. Есть библиотечка "pcomm.dll" для работы с расширителями Com"порта, там есть все, если интересно, мыльте.
А посоветую следующее: (для pcomm.dll)
1. Проверяем, есть что-то в буфере IN
2. Если есть, то забираем, ждем секунду и снова проверяем
3. Если ничего больше нет, то и пакет закончен


 
shane54 ©   (2003-11-26 20:20) [4]

Убери тока лищнее (лень самому):

procedure ReadFromHSMHost(var p_hsm_cmdi : integer; var p_hsm_cmds : string);
var
v_flag : boolean;
v_size, v_errs, v_mask : DWord;
v_cmdarr : array [0..4000] of char;
begin
v_flag := true;
while v_flag do
begin
v_mask := 0;
WaitCommEvent(HSMHostPort, v_mask, @Ovr);
if (v_mask and EV_RXFLAG) = EV_RXFLAG then
begin
ClearCommError(HSMHostPort, v_errs, @Stat);
v_size := Stat.cbInQue;
ReadFile(HSMHostPort, v_cmdarr, v_size, v_size, @Ovr);
p_hsm_cmds := String(v_cmdarr);
v_flag := false;
end;
end;
p_hsm_cmdi := StrToInt(Copy(p_hsm_cmds, 2, 4));
p_hsm_cmds := Copy(p_hsm_cmds, 6, v_size - 7);
end;



Страницы: 1 вся ветка

Текущий архив: 2004.02.10;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.02 c
14-29549
sad
2004-01-21 08:17
2004.02.10
Lazarus.Win32..Компонент для работы с Interbase Firebird.


3-29277
Nick-From
2004-01-16 00:41
2004.02.10
Присвоение параметру ХП значения


3-29226
raul
2004-01-19 18:20
2004.02.10
BDE API


14-29567
HermitAlex
2004-01-20 13:36
2004.02.10
Обучение игры в бильярд


3-29213
nomad
2004-01-19 18:31
2004.02.10
процедура в Oracle