Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа со сканером штрих-кода. [D6, 2000]


ttt_111 ©   (2006-08-08 12:26:00) 

При открытии программы (событие 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;
Но после этого программа полностью загружает ЦП. Что можно сделать?


tesseract   (2006-08-08 15:36:00) [1]

Да и порт в  overlapped-режиме  можно всегда оборвать CancelIO.


tesseract   (2006-08-08 15:35:00) [2]


> Сергей М. ©   (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;


Сергей М.   (2006-08-08 14:42:00) [3]

В справке же написано как правильно ..


ttt_111   (2006-08-08 14:33:00) [4]

А как правильно?


Сергей М.   (2006-08-08 13:02:00) [5]


> ttt_111   (08.08.06 12:58) [3]


Ты зачем, спрашивается, overlapped-режим задействовал ?
Просто "щоб було" или как ?


ttt_111   (2006-08-08 12:58:00) [6]

Процедура для чтения такая:
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]);


tesseract   (2006-08-08 12:52:00) [7]

в потоке использовать асинхронное чтение или ожидание по маске.


Сергей М.   (2006-08-08 12:29:00) [8]


> Что можно сделать?


Устранить ошибки в теле ReadComm(), приводящие к сабжу.


Наверх

Титульная страница Поиск, карта сайта Написать письмо