Текущий архив: 2005.10.30;
Скачать: CL | DM;
ВнизКак правильно работать с Com портом используя события. Найти похожие ветки
← →
Shopot © (2005-08-24 18:07) [0]Как правильно использовать функцию WaitCommEvent. Как с помощью нее считывать побайтно из порта заренее неизвестное кол-во символов.
← →
tesseract © (2005-08-25 11:10) [1]примерно так:
Инициализация
try
hCom:=CreateFile(fPortName,GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED{FILE_ATTRIBUTE_NORMAL},0);
// Если неверен выходим
if GetLastError=ERROR_ALREADY_EXISTS then
begin
CloseHandle(hCOM);
status:=GetLastError;
AddLog("Порт занят"+ fPortName)
end;
FillChar(ReadOl,SizeOF(ReadOL),0);
ReadOl.hevent:=CreateEvent(nil,true,true,nil);
Status:=GetLastError;
if (hCom=0) or (hCom=INVALID_HANDLE_VALUE) then
begin
Status:=GetLastError;
AddLog("Ошибка порта "+ fportName);
// crit.Release;
exit;
end
else
AddLog("Открыт порт "+ fportName);
// Устанавливаем буфер
if not(SetupComm(hCom,22,10)) then
begin
status:=GetLastError;
AddLog("SetupComm Error "+ fPortName);
exit;
end;
// Чистим буфер
if not(PurgeComm(hCom,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR )) then exit;
// Устанавливаем задержки/время ожидания
CommTimeOuts.ReadIntervalTimeout:= 50;
CommTimeOuts.ReadTotalTimeoutMultiplier := 10;
CommTimeOuts.ReadTotalTimeoutConstant := 00;
CommTimeOuts.WriteTotalTimeoutMultiplier := 10;
CommTimeOuts.WriteTotalTimeoutConstant := 00;
// DTR и RTS нам на фиг не нужен
EscapeCommFunction(hCom,SETDTR);
EscapeCommFunction(hCom,CLRRTS);
//Если не получилось выходим
SetCommTimeouts(hCom,CommTimeOuts);
// Устанавливаем параметры порта через DCB
if not(GetCommState(hCom,mDCB)) then
begin
status:=GetLastError;
AddLog("GetCommState Error "+ fPortName);
exit;
end;
MDCB.BaudRate:=fScalePar.hDCB.BaudRate;
MDCB.ByteSize:=fScalePAr.hDCB.ByteSize;
MDCB.Parity:=FscalePar.hDCB.Parity;
MDCB.StopBits:=FScalePar.hDCB.StopBits;
//Заполняем нужные параметры
// Устанавливаем параметры порта и перхвата
if not(SetCommState(hCom,mDCB)) then
begin
Status:=GetLastError;
Addlog("SetCommState Error "+ fPortName);
exit;
end;
// устанавливаем маску перехвата
if not(SetCommMask(hCom,fMask)) then
begin
Status:=GetLastError;
Addlog("SetComMask Error" +fportName);
exit;
end;
// Если дошли до сюда то всё ок
Result:=true;
finally
end;
Сколько байт пришло
var hCurState:TCOMSTAT;
ErrCode:cardinal;
begin
ClearCommError(hCom, ErrCode, @hCurState);
result:=hCurState.cbInQue;
end;
Само чтение
WaitCommEvent(hCom,tMask,@READOL);
fSignaled:= WaitForSingleObject(ReadOl.hEvent,WaitInt);
if (fSignaled = WAIT_OBJECT_0) then
begin
// смотрим что у нас
fSignaled:= WaitForSingleObject(ReadOl.hEvent,WaitInt);
// Если событие произошло то
if (fSignaled = WAIT_OBJECT_0) then
begin
// Читаем
if GetOverlappedResult(hCom, REadOL, BytesTrans,false) then
begin
// Сравниваем произошедшее событие с прибытием символа
if (tMask and EV_RXCHAR)<>0 then
begin
AvBytes:=GetAvBytes; // Сколько байтов пришло
if AvBytes>=fScalePar.Size then
begin
//try
// Если пришло нужное кол-во то
//buf:="";
if ReadFile(hCom,buf^,AvBytes,ReadBytes,@ReadOL) then
begin
// Чистим буфер
PurgeComm(hCom,PURGE_RXCLEAR);
result:=true;
// Если прочитали нужное кол-во
if (ReadBytes>=fScalePAr.Size) then
begin
if not terminated
then
begin
fWeight:=ScaleRead;
// ChangeWeight;
State:="Данные разобраны";
end;
end;
end// if REadFile
else
begin
// Ошибка
fWait.setEvent;
Status:=GetLastError;
Addlog("Чтение невозможно");
end; // if REadFile
// end;
end; // if AvBytes
end; // if Fmask
end;// if GetOVerlappedResult
end; // if Signaled
// end;
end; // waitcommevent
fWait.SetEvent;
← →
Shopot © (2005-08-25 12:16) [2]> tesseract
Спасибо!
Страницы: 1 вся ветка
Текущий архив: 2005.10.30;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.038 c