Главная страница
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.017 c
7-25622
reskator
2003-10-26 12:14
2004.01.09
программно отловить цифровой сигнал полученный из аналогового, по


1-25287
TATIANA
2003-12-23 09:49
2004.01.09
IMAGE


4-25640
Колян_К
2003-11-06 17:36
2004.01.09
Как из своей проги закрыть чужое окно


1-25317
Georg
2003-12-22 19:11
2004.01.09
DrawGrid фиксированные колонки


1-25273
xtz
2003-12-25 18:50
2004.01.09
Ув Мастера где можно скачать модуль Proxies.pas???