Конференция "WinAPI" » Почему возникает EBufferIsEmpty? [WinXP]
 
  • Flagman (04.06.12 06:59) [0]
    Пишу для личного пользования программу по учету всего и вся на некоторой торговой точке, появилась мысль - сделать персонализированные дисконтные карты для клиентов (сканер ШК Metrologic MS9520 дома уже несколько лет валяется, остался с прошлой работы, вот и решил его употребить во благо).
    Ранее с RS232 не работал, использую библиотеку AsyncPro, компонент TApdComPort.
    Столкнулся со следующей проблемой: когда в процедуре ApdComPortTriggerAvail начинаешь читать данные из порта, валится ошибка "EBufferIsEmpty". Не очень понимаю, как от нее избавиться.
    Нет ли у кого соображений, как эту загогулину порешить?
    Delphi XE, WinXP.

    Процедура вот (собственно, почти полная калька с демки...):

    procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
    var
     C : AnsiChar;
     S : String;
    begin
    S := '';
         while (ord(C)<>13)  do
        begin
         C := ApdComPort1.GetChar;
       case C of
         #0..#31 : ;
         else begin
         S := S + C;
         end;
       end;
     end;
       if S<> '' then ShowMessage(S);
     end;
  • sniknik © (04.06.12 07:53) [1]
    EBufferIsEmpty буфер пуст, нормальное состояние. читаешь в момент когда еще ничего нет (сам сканер ничего не прочитал/либо не с того объекта, если у тебя их 2).
  • sniknik © (04.06.12 07:59) [2]
    + либо, твоя "полная калька" совсем не полная, насколько вижу по найденным примерам эту ошибку просто блокируют... не желают видимо разбирать, что за событие переключило тригер, есть там данные от него или нет.
  • MBo © (04.06.12 09:09) [3]
    неправильная логика чтения.

    Читаешь из порта всё, что там есть - Count байт, складываешь в строку-аккумулятор (не локальную переменную).
    Проверяешь, есть ли в аккумуляторе признак конца посылки. Если есть, обрабатываешь посылку, удаляешь её из аккумулятора.

    (Если начало посылки обозначается, то его наличие тоже надо проверять)
  • Flagman (04.06.12 09:21) [4]
    sniknik, я, если честно, предполагал, что TriggerAvail и срабатывает в момент, когда в буфере уже есть, что прочитать...

    Вот оригинал процедуры из examples:

    var
     I : Word;
     C : Char;
     S : String;
    begin
     S := '';
     for I := 1 to Count do begin
       C := ApdComPort1.GetChar;
       case C of
         #0..#31 : {Don't display} ;
         else S := S + C;
       end;
     end;
     ShowMessage('Got an OnTriggerAvail event for: ' + S);
    end;

    При чтении сканером ШК, Месседжа выскакивает два подряд - первый с первым символом прочтенного ШК, второй - с остальными символами прочтенного ШК...
  • Flagman (04.06.12 09:34) [5]
    MBo, спасибо! Въехал! :)))
 
Конференция "WinAPI" » Почему возникает EBufferIsEmpty? [WinXP]
Есть новые Нет новых   [134430   +3][b:0][p:0]