Чтение двоичных данных с последовательного порта с использованием компонента Dejan TComport Delphi - PullRequest
2 голосов
/ 17 марта 2010

Извиняюсь за этот вопрос, но я немного новичок с Delphi. Я использую компонент Dejan TComport для получения данных от последовательного порта. Блок оборудования, подключенного к порту, отправляет около 100 байтов двоичных данных в последовательный порт. То, что я хочу сделать, это извлечь байты в виде числовых значений в массив, чтобы я мог выполнять вычисления на них.

TComport имеет метод Read (buffer, Count), который считывает данные из буфера ввода.

function Read(var Buffer; Count: Integer): Integer;

В справке говорится, что переменная Buffer должна быть достаточно большой, чтобы содержать байты Count, но не дает никакого примера того, как использовать эту функцию. Я вижу, что переменная Count содержит количество полученных байтов, но я не могу найти способ доступа к байтам в Buffer.

TComport также имеет метаданный Readstr, который считывает данные из входного буфера в переменную STRING.

function ReadStr(var Str: String; Count: Integer): Integer;

Снова переменная Count показывает количество полученных байтов, и я могу использовать Memo1.Text: = str для отображения некоторой информации, но, очевидно, у Memo1 проблемы с отображением управляющих символов. Я пробовал разные способы извлечения байтовых данных из Str, но пока безуспешно.

Я уверен, что это должно быть легко. Здесь надеемся.

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

В этой функции

function Read(var Buffer; Count: Integer): Integer;

Параметр Count - это количество байтов, которые вы ожидаете прочитать. В то время как возвращаемое значение функции фактически читается байтами.

Если у вас есть буфер, определенный как массив из 100 байтов, вы можете кодировать

x := Read(Buffer, 100);

и если входное значение составляет только 70 байтов, то x будет 70. Таким образом, вы можете читать, пока х> 0

0 голосов
/ 17 марта 2010
// I use a timer to read a weight coming in on the Serial Port
// but the routing could also be triggered by OnRXChar (received data event)
// or OnRXBufferFull event.

var
  WeightString: String; //global

procedure TfmUDF.tmScaleTimer(Sender: TObject);
var
  Data: AnsiString;
begin
  ReadStr(Data,Count); //the individual bytes can be read Data[n].....
  WeightData:=WeightData+Data; //just keeps adding the incoming data
end;

Помогает ли это?

0 голосов
/ 17 марта 2010

@ johnma, я рекомендую использовать TurboPower Async Library , она очень эффективна, имеет много примеров и хорошо документирована.

проверьте эти ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...