Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
14-1583
Внук
2003-08-13 14:36
2003.09.01
Удаление веток


3-1298
Jacob
2003-08-10 14:41
2003.09.01
Corrupt Memo/BLOB file


1-1411
sergg
2003-08-09 18:17
2003.09.01
Русские символы из 98 в ХР


14-1610
Феликс
2003-08-11 22:42
2003.09.01
НОВЫЙ САЙТ ПО ДЕЛФИ. ЗАЦЕНИТЕ.


3-1314
gsvserg
2003-08-08 15:25
2003.09.01
Возможно ли сделать такой запрос?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский