Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1146761361
Antonyan
2006-05-04 20:49
2006.08.27
Опять кнопка Пуск


15-1154599017
Чапаев
2006-08-03 13:56
2006.08.27
Как настоить Jimm?


15-1154285491
Ксардас
2006-07-30 22:51
2006.08.27
Автозаполнение в поисковиках


15-1154259582
antonn
2006-07-30 15:39
2006.08.27
вопросик по ява-скрипту


15-1153576090
vidiv
2006-07-22 17:48
2006.08.27
Эталон мужской красоты :)





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