Форум: "Система";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c