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

Вниз

Работа с COM-портом   Найти похожие ветки 

 
Mor ©   (2003-06-17 00:46) [0]

Мастера помогите. Работаю с COM-портом. Инициализация DCB-структуры для него следующая:
DCB.BaudRate:=CBR_19200;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
DCB.EvtChar:=Chr($0D);

Процедура приема данных:
procedure ReadCom;
var
Recive: array [0..255] of char;
i: integer;
begin
TransMask:=0;
for i:=0 to 255 do recive[i]:=Chr(0);
ReceivedString:="";
repeat
WaitCommEvent(ComHandle,TransMask,@Ovr);
if (TransMask and EV_RXFLAG)=EV_RXFLAG then begin
ClearCommError(ComHandle,Errs,@Stat);
KolByte:=Stat.cbInQue;
ReadFile(ComHandle,Recive,KolByte,KolByte,@Ovr);
ReceivedString:=string(recive);
end;
until ReceivedString<>"";
end;

Процедура отправки:
procedure WriteCom(s: string);
var
buffer: array [0..255] of byte;
i: integer;
begin
KolByte:=StrLen(PChar(s));
for i:=0 to 255 do buffer[i]:=0;
for i:=1 to KolByte do buffer[i-1]:=ord(s[i]);
WriteFile(ComHandle,buffer,KolByte,KolByte,@Ovr);
end;

Всё это дело на скорости 2400 работает очень даже сносно, а на скорости 19200 возникают
Искажения данных при приёме. Посмотрите пожалуйста код, может кто сможет прояснить причину. И если не трудно подскажите более удачную реализации процедуры приёма данных, а то чувствую что она у меня криво сделана.


 
GEN ©   (2003-06-17 12:25) [1]

А если использовать готовый компонент. Например: на www.Torry.ru
есть nrCommLib.


 
AlexRush ©   (2003-06-17 13:44) [2]

Не совсем корректно организовано чтение из порта.
Я использовал Overlapped I/O и делал так:
*Читаю из порта ReadFile
*беру последнюю ошибку, если она ERROR_IO_PEEDENG, то все в порядке, система поставила запрос на чтение в очередь
*жду поступления данных WaitForSingleObject
*проверяю результат с пом GetOverlappedResult
*если все Ok - то в буфере, указаном в параметре lpBuffer в ReadFile уже содержатся данные.
пример:

void __stdcall CCommPort::ReadCommThreadProc(){
DWORD dwReaded,dwTransfered;
char buf[COMM_BUF_SIZE];

//if(GetCurrentThread()!=hThread) return;

while(TRUE){
ZeroMemory(buf,COMM_BUF_SIZE);
dwReaded = 0;
dwTransfered = 0;
if(fOnWaitAnswerProc)fOnWaitAnswerProc(this,1);
if(!ReadFile(hComm,
buf,
COMM_BUF_SIZE,
&dwReaded,
&ovr)
){
switch(GetLastError()){
case ERROR_IO_PENDING:
if(WAIT_OBJECT_0
==
WaitForSingleObject(ovr.hEvent,INFINITE)
){
if(!GetOverlappedResult(hComm,&ovr,&dwTransfered,TRUE)){
fSuccessful = FALSE;
return;
}
else dwReaded = dwTransfered;
}
else return;
break;
( !ReadFile(pObj->GetCommHandle()
Не совсем корректно организовано чтение из порта.
Я использовал Overlapped I/O и делал так:
*Читаю из порта ReadFile
*беру последнюю ошибку, если она ERROR_IO_PEEDENG, то все в порядке, система поставила запрос на чтение в очередь
*жду поступления данных WaitForSingleObject
*проверяю результат с пом GetOverlappedResult
*если все Ok - то в буфере, указаном в параметре lpBuffer в ReadFile уже содержатся данные.
пример:

void __stdcall CCommPort::ReadCommThreadProc(){
DWORD dwReaded,dwTransfered;
char buf[COMM_BUF_SIZE];

//if(GetCurrentThread()!=hThread) return;

while(TRUE){
ZeroMemory(buf,COMM_BUF_SIZE);
dwReaded = 0;
dwTransfered = 0;
if(fOnWaitAnswerProc)fOnWaitAnswerProc(this,1);
if(!ReadFile(hComm,
buf,
COMM_BUF_SIZE,
&dwReaded,
&ovr)
){
switch(GetLastError()){
case ERROR_IO_PENDING:
if(WAIT_OBJECT_0
==
WaitForSingleObject(ovr.hEvent,INFINITE)
){
if(!GetOverlappedResult(hComm,&ovr,&dwTransfered,TRUE)){
fSuccessful = FALSE;
return;
}
else dwReaded = dwTransfered;
}
else return;
break;
}
}//if(!ReadFile(pObj->GetCommHandle(),
if(fOnWaitAnswerProc)fOnWaitAnswerProc(this,0);
if(dwReaded) OnDataRead(buf,dwReaded);
Sleep(20);
}// wtd
}

P.S. Посмотри форумы недельной/месячной давности. Там десятки сообщений по теме.


 
Mor ©   (2003-06-17 16:37) [3]

To AlexRush:
А что это за структкра такая Overlapped и для чего используется?
Я справку смотрел но ясности это не внесло.



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

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

Наверх




Память: 0.48 MB
Время: 0.026 c
1-1364
SIW
2003-08-17 19:37
2003.09.01
Работа с TStringList


14-1585
Феликс
2003-08-13 22:24
2003.09.01
Вы в курсе, что сегодня и завтра в Ин-нет лучше не выходить?


1-1362
Borealis
2003-08-19 00:23
2003.09.01
Сколько детей у корня TTreeView?


1-1404
PlaZZma
2003-08-16 02:12
2003.09.01
передача компонента в функцию


4-1735
sserge
2003-06-30 02:43
2003.09.01
Как изменить дату создания директории