Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизРабота со сканером штрих-кода. Найти похожие ветки
← →
ttt_111 (2006-08-08 12:26) [0]При открытии программы (событие FormShow) происходит инициализация порта для считывания штрих-кода, с помощью следующей функции procedure PortInit;
var
ThreadID:dword;
begin
//создание и иницализация порта
KolByte:=0;
//создание порта и получение его хэндла
CommHandle := CreateFile(PChar(Com),GENERIC_READ or GENERIC_WRITE,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.BaudRate:=DCB_osn.BaudRate;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=DCB_osn.ByteSize;
//DCB.StopBits:=OneStopBit;
DCB.StopBits:=DCB_osn.StopBits;
DCB.EvtChar:=chr(13);//задание символа для флага
//устанавливаем DCB
SetCommState(CommHandle,DCB);
//создаем паралельный поток
//там будет вертеться процедура приема строки
//с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;
Но после этого программа полностью загружает ЦП. Что можно сделать?
← →
Сергей М. © (2006-08-08 12:29) [1]
> Что можно сделать?
Устранить ошибки в теле ReadComm(), приводящие к сабжу.
← →
tesseract © (2006-08-08 12:52) [2]в потоке использовать асинхронное чтение или ожидание по маске.
← →
ttt_111 (2006-08-08 12:58) [3]Процедура для чтения такая:
procedure ReadComm;
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;
Resive := "";
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);
FlagSH := true;
end;//mask
end;//while
end;
А в событии OnTimer когда FlagSH = true обрабатывается
for i := 0 to 15 do
if StrPos("0123456789",PChar(string(PortUnit.Resive[i]))) <> nil then
str := str + string(PortUnit.Resive[i]);
← →
Сергей М. © (2006-08-08 13:02) [4]
> ttt_111 (08.08.06 12:58) [3]
Ты зачем, спрашивается, overlapped-режим задействовал ?
Просто "щоб було" или как ?
← →
ttt_111 (2006-08-08 14:33) [5]А как правильно?
← →
Сергей М. © (2006-08-08 14:42) [6]В справке же написано как правильно ..
← →
tesseract © (2006-08-08 15:35) [7]
> Сергей М. © (08.08.06 14:42) [6]
отлично работает и с overlapped и без overlapped.
Здесь overlapped не используется
function TSVP.AsyncRead:boolean;
var tMask:DWord;
fSignaled:integer;
REadBytes:cardinal;
avbytes:integer;
begin
result:=false;
ifRead:=false;
ifDecode:=false;
//Страховка
PurgeComm(hCom,PURGE_RXCLEAR);
FillChar(buf,7,0);
// убираем событие - идёт запись
if hCom=0 then begin fLAstError:=ErrInterfaceError; exit;end;
// Если надо синхронизироваться, то делаем это
// Ждём сообщения о чтении
WaitCommEvent(hCom,tMask,@READOL);
fSignaled:= WaitForSingleObject(ReadOl.hEvent,1000);
if (fSignaled = WAIT_OBJECT_0) then
begin
// смотрим что у нас
// Читаем
if GetOverlappedResult(hCom, ReadOL, ReadBytes,true) then
begin
// Сравниваем произошедшее событие с прибытием символа
if (tMask and EV_RXCHAR)<>0 then
begin
AvBytes:=GetAvBytes; // Сколько байтов пришло
if AvBytes>=7 then
begin
try
if ReadFile(hCom,buf,AvBytes,ReadBytes,nil) then
begin
// Чистим буфер
PurgeComm(hCom,PURGE_RXCLEAR);
result:=true;
ifRead:=true;
ifDecode:=false;
// Если прочитали нужное кол-во
if (ReadBytes>=7) then fweight:=decode(ReadBytes);
end;
except
end;
end; // if AvBytes
end; // if Fmask
end;// if GetOVerlappedResult
end // if Signaled
// end;
else
begin
fWeight:=0;
CancelIo(hcom);
end;
end;
← →
tesseract © (2006-08-08 15:36) [8]Да и порт в overlapped-режиме можно всегда оборвать CancelIO.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.575 c