Вот несколько открытых вопросов в воздухе, поэтому я должен сделать некоторые предположения, которые могут быть неправильными, но давайте посмотрим.
Я не знаю, какую библиотеку коммуникационных портов вы используете, поэтому я предполагаю, что это библиотека CPort от SourceForge. Я никогда не использовал его сам, но я прочитал, что это сделано в Unicode, так что вы можете вызвать методы write с параметром unicodestring, который будет преобразован библиотекой в ansistring перед отправкой. Аналогично, когда вы получаете передачу из внешнего мира, библиотека будет конвертировать в unicodestring для методов Read.
Из-за асинхронного характера последовательной связи важно понимать, что когда вы отправляете что-то с помощью метода write, метод возвращается немедленно, когда библиотека и ОС выплевывают символы по одному в то время в темпе, определяемом скорость передачи в бодах. В результате ваш первый код так и не получил ничего, потому что вы уже пытались прочитать из коммуникационного порта, прежде чем внешнее устройство даже получило первый символ. Хорошо видеть, что вы сделали первый шаг к успеху, выполнив обработчик событий (предположительно событие библиотеки) OnRxChar.
Возможно, OnRxChar срабатывает для каждого символа (или пары символов). У вас должен быть буфер, который является постоянным между этими событиями. Локальный var (как у вас есть сейчас и который выделен в стеке) в обработчике событий не является постоянным, он теряется каждый раз, когда обработчик событий выходит. Вы должны объявить переменную Buffer как поле TReaderProgrammer. Я не знаю, почему вы определили буфер как AnsiString, но я предлагаю вам попробовать со строкой (см. Обсуждение выше относительно осведомленности Unicode).
type
TReaderProgrammer = class
..
RxBuffer: string;
..
end;
буфер должен быть очищен, когда вы отправляете команду на внешнее устройство, для того, чтобы быть готовым получить новые данные в ответ на вашу команду.
EDIT: В качестве альтернативы вы можете очистить RxBuffer сразу же после получения и обработки полного ответа.
TReaderProgrammer.ComPort1RxChar должен выглядеть следующим образом ГНФАР:
procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer);
var
RxData : string;
begin
(Sender as TComPort).ReadStr(RxData,Count);
RxBuffer := RxBuffer + Rxdata;
...
end;
Остальная часть обработчика событий, я догадаться, наверное, просто увидеть прогресс приема, так что больше ничего об этом.
Вы не можете прочитать ответ в своем методе отправки. Получите данные в событии приема (вы должны использовать глобальный буфер), и когда получено достаточное количество данных (или символ # 10), интерпретируйте ответ. Вы также можете добавить таймер, чтобы получить уведомление о тайм-ауте, если ответ не получен вовремя. –
Привет, Lu Rd, спасибо за ответ. У меня уже есть событие Receive, но оно не отображает данные, поэтому идентификатор мысли должен читать снова, но теперь я вижу, что это был метод, который я использовал для отправки данных. @LU RD –