Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.012 c
6-25479
CaDIsT
2003-11-03 09:30
2004.01.09
TTcpServer и TTcpClient


1-25310
ximka
2003-12-22 13:54
2004.01.09
отслеживание события & RegExp


3-25196
SZap
2003-12-03 11:15
2004.01.09
AdsQuery с таблицами dbf в которых есть записи помеченные как уд


6-25467
X-Disa
2003-11-09 12:35
2004.01.09
Stream


1-25425
ЮрийК
2003-12-22 18:29
2004.01.09
Селектирование слов в WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский