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

Вниз

ReadFile не удается прочитать весь массив данных   Найти похожие ветки 

 
INTAARI   (2003-10-29 11:39) [0]

Привет коллег!!!
Пытаюсь прочитать с СОМ порта поток данных с фиксированным количеством символов.
Данные записываю в массив (char) с длинной равной количеству символов. Часть данных записывается в массив, но всегда разное количество символов, остальное #0. Чтение данных начинается по приходу символа $, который прописывается в DCB. Немогу понять где ошибка.

procedure ReadComm;
var
Resive:array [0..472]of char;
begin
while true do
begin
TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
begin
ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
//тут должна идти обработка принятой информации из Resive
Form1.Label1.Caption:=string(Resive);
end;//mask
end;//while
end;

procedure PortInit;
var
ThreadID:dword;
begin
//создание и иницализация порта
KolByte:=0;

//создание порта и получение его хэндла
CommHandle := CreateFile("COM2",GENERIC_READ,0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

//ставим маску - "по пришествии определенного символа"
SetCommMask(CommHandle,EV_RXFLAG);

//построение DCB
GetCommState(CommHandle,DCB);
DCB.BaudRate:=CBR_9600;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
DCB.EvtChar:=chr(36);//задание символа для флага $
//устанавливаем DCB
SetCommState(CommHandle,DCB);
//создаем паралельный поток
//там будет вертеться процедура приема строки
//с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;


 
Slym ©   (2003-10-29 12:26) [1]

Типа если нужно прочитать не 473 а $FFFFFFFF байтов то надо так делать: ReadFile(CommHandle,Resive,$FFFFFFFF,Kols,@Ovr);
ошибаешься... у тебя Resive порвется :)
ReadFile читает скоко в com буфере лежит - если появился $ это не значит что вся строка записана в буфер, а значит что в буфере есть как минимум один символ $ и он может быть единственным там... ну не успело устройство записать все в ком а ты уже читаешь...


 
Slym ©   (2003-10-29 12:30) [2]

ReadFile - 4 параметр тебе на что? (address of number of bytes read) адрес куда положить циферку "скоко прочитал"...
прочитал меньше чем надо? - дочитывай пока не доберешь своих 473 байта


 
INTAARI   (2003-10-29 12:51) [3]

Спасибо за ответ, но в принципе мне достаточно установить 3 параметр 473 - стало приниматься все сообщение. Поэтому непонятно зачем использовать 4 параметр.



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

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

Наверх




Память: 0.47 MB
Время: 0.016 c
1-25361
VadimS
2003-12-25 13:32
2004.01.09
ShowModal .... ShowModal


1-25338
Кен
2003-12-08 06:30
2004.01.09
Как можно БЫСТРО найти в массиве одинаковые числа ?


1-25373
Indy
2003-12-25 04:45
2004.01.09
Документация по Indy


9-25170
mrk
2003-06-15 16:33
2004.01.09
как сделать звезды в glscne?


3-25210
Layner
2003-12-11 09:46
2004.01.09
Можно ли установить SQL Server на Win2000Prof?