Показать сообщение отдельно
  #5  
Старый 10.06.2011, 16:05
MCDFV MCDFV вне форума
Прохожий
 
Регистрация: 10.06.2011
Сообщения: 2
Репутация: 10
По умолчанию

Доброго всем времени суток!
Задача которая стоит передомной: есть девайс который раз в 5 секунд посылает на ком порт пакет такого формата 84 хх хх хх хх 85(в шеснадцатерисном значении), где хх 4 байта значение можности. Эти пакеты нужно принимать, заначение можности выводить в много строчное текстовое поле, создавать экселевский файл и записывать в каждую я чейку значения можности. Ну вывод в многострочное текстовое поле вообще проюблем нет, создание экселевского файла и запись в него думаю осилю, а вот с ком портом проблемы.
Как говорил programm007 использовал компонет bcomport в асинхронном режиме, использовал собитые OnRxChar компонета и чтение в строковую переменную и в многострочное текстовое поле выводил количество запрашиваемых для чтения байт, и количество байт которые удалось прочитать.
Пример с хелпа на компонет:
Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  Stat: PAsync;
  N: Integer;
begin
  InitAsync(Stat);
  try
    BComPort1.ReadStrAsync(Str, Count, Stat);
    repeat
      // Выполнение других действий
    until BComPort1.IsAsyncCompleted(Stat);
    N := BComPort1.WaitForAsync(Stat);
    if N <> Count then SetLength(Str, Count);
  finally
    DoneAsync(Stat);
  end;
  // Действия с переменной Str
end;
Админ: Пользуемся тегами для оформления кода!

Наблюдаю такую картину иногда процедура читает полностью весь пакет, т.е выводится что процедура прочла все 6 байт, а иногда показывается что при приёме пакета процедура была выполнена 2 раза, т.е читаем сначала например 2 байта, а потом 4 байта. Причем таких случаев половина, не терять же мне половину данных? Нет. Ещё пакет может разбиваться на такие варианты приходит 1 и 5 байт, 2 и 4 байта, 3 и 3, 4 и 2, ну соответственно 5 и 1. и всегда сумма получается 6 байт.
Мои мысли по этому поводу: процедура успевает выполниться быстрее чем придут данные в буфер порта. А так как я в конце процедуры очищаю приёмный буфер, то оно опять видит что данные в буфере есть и опять выполняется эта процедура.
Прощу помощи как написать эту часть программы чтобы за 1 раз стабильно читался весь пакет 6 байт.
Пакеты от устройства приходят стабильно, пакеты корректные, проверял в терминалке.
За рание всем спасибо за внимание.
Ответить с цитированием