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

Вниз

Работа со сканером штрих-кода.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
6-1144309337
DVM
2006-04-06 11:42
2006.08.27
Как замедлить прием данных с сервера HTTP


15-1154422756
Vaitek__
2006-08-01 12:59
2006.08.27
Видео и ДВД


2-1155109671
vladimirg88
2006-08-09 11:47
2006.08.27
про таймер


2-1154607114
TrainerOfDolphins
2006-08-03 16:11
2006.08.27
Refresh с возвратом на вновь вставленную запись.


15-1154515042
Kerk
2006-08-02 14:37
2006.08.27
Что такое "харизма"?