Компонент для последовательного устройства (TRS232)
Просыпается программист с большого бодуна, поворачивается, а рядом какая-то девушка лежит.
- Ooрs, обнаружено новое устройство...
Компонент, который представлен здесь, выполняет функции синхронного чтения и записи в последовательный интерфейс RS232.
В цикле выполняется Application.ProcessMessages, чтобы все сообщения от основной программы обрабатывались.
Ниже приведён метод ReadString из компонента TRS323:
function TRS232.ReadString(var aResStr: string; aCount: word ): boolean;
var
nRead: dword;
Buffer: string;
Actual, Before: TDateTime;
TimeOutMin, TimeOutSec, lCount: word;
begin
Result := false;
ifnot Connected thenifnot Connect thenraise Exception.CreateHelp('RS232.ReadString:' +
' Connect not possible !', 101);
aResStr := '';
TimeOutMin:=TimeOut div 60;
TimeOutSec:=TimeOut mod 60;
if (not Connected) or (aCount <= 0) then
EXIT;
nRead := 0; lCount := 0;
Before := Time;
while lCount < ACOUNT dobegin
Application.ProcessMessages;
SetLength(Buffer,1);
if ReadFile( FComPortHandle, PChar(Buffer)^, 1, nRead, nil) thenbeginif nRead > 0 thenbegin
aResStr := aResStr + Buffer;
inc(lCount);
end;
Actual := Time;
if Actual-Before>EncodeTime(0, TimeOutMin, TimeOutSec, 0) thenraise Exception.CreateHelp('RS232.ReadString: TimeOut !', 103);
endelsebeginraise Exception.CreateHelp('RS232.ReadString: Read not possible !', 104);
end;
end;
Result:=true;
end;
Программный компонент Delphi для серийного устройства (TRS232)!
Предоставленная кодовая строка является частью компонента TRS232, который реализует синхронное чтение и запись в интерфейсе RS232. Метод ReadString читает указанное количество символов из порта серийной связи и возвращает их как строку.
aResStr: Переменная для хранения прочитанной строки.
aCount: Количество символов, которые нужно прочитать.
Результат: Логическое значение, указывающее, была ли операция успешной.
Переменные
1. nRead: целочисленная переменная для хранения фактического количества байтов, прочитанных из порта серийной связи.
2. Buffer: строковая переменная для хранения одиночного символа, прочитанного из порта серийной связи.
3. Actual и Before: переменные типа TDateTime, используемые для целей времени.
4. TimeOutMin и TimeOutSec: целочисленные переменные, представляющие таймаут в минутах и секундах соответственно.
Код
1. Метод проверяет, подключен ли компонент (Connected) и бросает исключение, если нет (Connect).
2. Он устанавливает начальные значения aResStr, nRead и lCount.
3. Цикл выполняется до тех пор, пока lCount не достигнет aCount. В каждой итерации:
* Обрабатывается очередь сообщений приложения с помощью Application.ProcessMessages.
* Одиночный символ читается из порта серийной связи с помощью ReadFile (FComPortHandle, Buffer^, 1, nRead, nil).
* Если символ был прочитан успешно (nRead > 0):
+ Символ добавляется к aResStr.
+ lCount увеличивается.
* Метод проверяет, превышен ли таймаут, вычисляя elapsed time (Actual - Before) и сравнивая его с указанным таймаутом. Если превышен, бросается исключение.
4. Наконец, метод возвращает логическое значение, указывающее, была ли операция успешной (Result := true;).
Альтернативное решение
Хотя это реализация работает нормально, есть некоторые потенциальные проблемы:
Функция ReadFile может блокироваться, если нет данных в порте серийной связи, что могло привести к таймауту.
Компонент не обрабатывает ошибки должным образом, бросая исключения без meaningful error messages.
*
Чтобы улучшить код, вы можете рассмотреть использование неблокирующих операций ввода-вывода (например, ReadFileEx) и реализовать более robust механизмы обработки ошибок. Кроме того, вам может потребоваться добавить журналирование или уведомления для целей отладки.
Компонент TRS232 для последовательного устройства позволяет синхронно читать и записывать данные по интерфейсу RS232, обрабатывая все сообщения от основной программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.