Работа с последовательными портами (COM-портами) - важная задача для разработчиков, взаимодействующих с различным оборудованием, микроконтроллерами (например, Arduino) и другими устройствами. В этой статье мы рассмотрим различные подходы к работе с COM-портами в Delphi и Free Pascal, включая стандартные методы и сторонние библиотеки.
Основные подходы к работе с COM-портом
1. Прямой доступ к файлу устройства (Linux)
На Unix-подобных системах (включая Linux) последовательные порты представлены как специальные файлы в директории /dev (например, /dev/ttyUSB0 или /dev/ttyACM0). Теоретически, с ними можно работать как с обычными файлами:
var
f: text;
begin
Assign(f, '/dev/ttyUSB0');
Rewrite(f);
Write(f, 'Текст для отправки');
CloseFile(f);
end.
Однако этот подход имеет существенные ограничения: - Невозможно настроить параметры порта (скорость, биты данных, стоп-биты и т.д.) - Ограниченные возможности чтения данных - Проблемы с правами доступа
2. Использование стандартного модуля Serial.pp (Free Pascal)
Free Pascal включает модуль Serial, который предоставляет базовые функции для работы с COM-портами:
uses
Serial;
var
SerHandle: LongInt;
Flags: TSerialFlags;
begin
SerHandle := SerOpen('/dev/ttyACM0');
if SerHandle < 0 then
begin
WriteLn('Ошибка открытия порта: ', fpGetErrno);
Exit;
end;
Flags := [];
SerSetParams(SerHandle, 9600, 8, NoneParity, 1, Flags);
// Отправка данных
SerWrite(SerHandle, 'Тестовая строка'#13#10, 16);
// Чтение данных
// ...
SerClose(SerHandle);
end.
Проблемы и решения: 1. Ошибка открытия порта (возвращает -1): - Убедитесь, что устройство существует (ls /dev/tty*) - Проверьте права доступа (пользователь должен быть в группе dialout) - Убедитесь, что порт не занят другим процессом
Добавление пользователя в группу dialout: sudo usermod -a -G dialout ваш_пользователь После этого необходимо выйти из системы и войти снова.
3. Сторонние библиотеки
Synapse (для Delphi и Free Pascal)
Библиотека Synapse предоставляет кросс-платформенное решение для работы с COM-портами:
uses
SynaSer;
var
ser: TBlockSerial;
begin
ser := TBlockSerial.Create;
try
ser.Connect('/dev/ttyUSB0'); // или 'COM1' для Windows
ser.Config(9600, 8, 'N', 1, False, False);
if ser.LastError <> 0 then
begin
WriteLn('Ошибка: ', ser.LastErrorDesc);
Exit;
end;
ser.SendString('Тестовая строка'#13#10);
// Чтение данных
// ...
finally
ser.Free;
end;
end.
TLazSerial (для Lazarus)
Компонент TLazSerial предоставляет удобный интерфейс для работы с COM-портами в Lazarus:
Установите пакет из https://github.com/JurassicPork/TLazSerial
Использование:
// В обработчике события OnOpen
procedure TForm1.SerialPortOpen(Sender: TObject);
begin
Serial.WriteData('Тестовая строка'#13#10);
end;
// В обработчике события OnRxData
procedure TForm1.SerialPortRxData(Sender: TObject);
var
data: string;
begin
data := Serial.ReadData;
Memo1.Lines.Add('Получено: ' + data);
end;
4. Работа с виртуальными COM-портами (socat)
Для тестирования без реального оборудования можно использовать утилиту socat для создания виртуальных COM-портов:
socat -d -d pty,rawer,echo=0 pty,rawer,echo=0
Эта команда создаст два связанных виртуальных порта (например, /dev/pts/11 и /dev/pts/12), через которые можно передавать данные.
Решение проблем
Arduino не определяется
Убедитесь, что Arduino подключен и питается
Проверьте, как устройство определяется в системе:
Оригинальные Arduino Uno обычно определяются как /dev/ttyACM0
Клоны с чипами CH340 могут определяться как /dev/ttyUSB0
Проверьте права доступа к устройству
Ошибки при работе с портом
Используйте fpGetErrno для получения кода ошибки: if SerHandle < 0 then WriteLn('Код ошибки: ', fpGetErrno);
Расшифруйте ошибку с помощью команды errno в терминале: errno 13 EACCES 13 Permission denied
Заключение
Работа с последовательными портами в Delphi и Pascal требует понимания особенностей операционной системы и правильного выбора инструментов. Для простых задач может подойти стандартный модуль Serial, для более сложных - специализированные библиотеки вроде Synapse или TLazSerial. Всегда проверяйте права доступа к устройству и убедитесь, что порт не занят другим процессом.
Примеры кода и дополнительные материалы можно найти в репозиториях:
- https://github.com/MarkMLl/serialcomms
- https://github.com/JurassicPork/TLazSerial
- https://wiki.freepascal.org/Hardware_Access#Synaser
Статья посвящена методам работы с последовательными портами в Delphi и Free Pascal, включая прямое обращение к файлам устройств, использование стандартных модулей и сторонних библиотек, а также решение типичных проблем.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.