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