Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с последовательным портом в Delphi и Pascal: особенности и примеры кода

Delphi , Файловая система , Порты

 

Введение

Работа с последовательными портами (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) - Убедитесь, что порт не занят другим процессом

  1. Добавление пользователя в группу 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:

  1. Установите пакет из https://github.com/JurassicPork/TLazSerial
  2. Использование:
// В обработчике события 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 не определяется

  1. Убедитесь, что Arduino подключен и питается
  2. Проверьте, как устройство определяется в системе:
  3. Оригинальные Arduino Uno обычно определяются как /dev/ttyACM0
  4. Клоны с чипами CH340 могут определяться как /dev/ttyUSB0
  5. Проверьте права доступа к устройству

Ошибки при работе с портом

  1. Используйте fpGetErrno для получения кода ошибки:
    if SerHandle < 0 then WriteLn('Код ошибки: ', fpGetErrno);
  2. Расшифруйте ошибку с помощью команды 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Порты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-04 02:57:57/0.0035820007324219/0