Документация Engee

Программное управление COM

На этой странице представлены все доступные функции программного управления CAN в Engee.

Чтобы работать с функциями программного управления COM в Engee, установите пакет поддержки оборудования как указано в статье. После выполните:

using Main.EngeeDeviceManager.Devices.COM

Далее необходимо создать COM-объект:

COM.Com()
COM.close(device, port::String)

Закрывает COM-порт и освобождает ресурсы.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

  • port::String: название порта.

COM.get_devices(device) → Vector{String}

Возвращает список доступных COM-портов (например, ["COM1", "COM3", "/dev/ttyUSB0"]).

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

COM.init(device, port::String, baudrate::Int64, bytesize::String, parity::String, stopbits::String)

Задает конфигурацию порта.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

  • port::String: название порта.

  • baudrate::Int64: скорость. Стандартные значения: 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000, 230400, 256000, 460800, 921600.

  • bytesize::String: размер байта. Допустимые строковые значения:

    • "FIVE_BITS": 5 бит;

    • "SIX_BITS": 6 бит;

    • "SEVEN_BITS": 7 бит;

    • "EIGHT_BITS": 8 бит.

    По умолчанию — "EIGHT_BITS".

  • parity::String: четность. Допустимые строковые значения:

    • "PARITY_NONE": без бита четности;

    • "PARITY_EVEN": четность (even);

    • "PARITY_ODD": нечетность (odd);

    • "PARITY_MARK": бит четности всегда 1 (mark);

    • "PARITY_SPACE": бит четности всегда 0 (space).

  • stopbits::String: стоп-биты. Допустимые строковые значения:

    • "STOPBITS_ONE": 1 стоп-бит;

    • "STOPBITS_ONE_POINT_FIVE": 1.5 стоп-бита;

    • "STOPBITS_TWO": 2 стоп-бита.

COM.open(device, port::String)

Открывает COM-порт с заданной конфигурацией.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

  • port::String: название порта.

COM.receive(device, port::String, bytes_to_read::Int64) → Vector{UInt8}

Читает указанное число байт из порта.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

  • port::String: название порта.

  • bytes_to_read::Int64: количество байт для чтения.

COM.transmit(device, port::String, message::Vector{UInt8}) → Int64

Отправляет массив байт. Возвращает количество отправленных байт.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.

  • port::String: название порта.

  • message::Vector{UInt8}: массив байт.

Пошаговый пример работы с COM (виртуальные порты)

Для тестирования без физического устройства удобно использовать виртуальные COM-порты через socat. Настройте пару связанных псевдотерминалов:

socat -d -d PTY,link=/tmp/ttyV0,b9600 PTY,link=/tmp/ttyV1,b9600 &

Теперь /tmp/ttyV0 и /tmp/ttyV1 — виртуальная «перемычка»: все, что записывается в один порт, читается из другого.

Создание COM-объекта

com = COM.Com()

Получение списка портов

ports = COM.get_devices(com)
println("Доступные порты: $ports")

Инициализация и открытие портов

port_send = "/tmp/ttyV0"
port_recv = "/tmp/ttyV1"

# Инициализация с идентичными параметрами
COM.init(com, port_send, 9600, "EIGHT_BITS", "PARITY_NONE", "STOPBITS_ONE")
COM.init(com, port_recv, 9600, "EIGHT_BITS", "PARITY_NONE", "STOPBITS_ONE")

# Открытие портов
COM.open(com, port_send)
COM.open(com, port_recv)

Обмен данными

data = UInt8[]

for i in 1:20
    push!(data, i)

    # Отправка накопленных байт
    sent = COM.transmit(com, port_send, data)
    println("Отправлено $sent байт: $data")

    # Прием такого же количества байт
    received = COM.receive(com, port_recv, length(data))
    println("Получено байт: $received")

    @assert data == received
end

Работа с нестандартными параметрами

Пример подключения на скорости 19200, 6 бит данных, четность even, 2 стоп-бита:

COM.init(com, "/tmp/ttyV2", 19200, "SIX_BITS", "PARITY_EVEN", "STOPBITS_TWO")
COM.open(com, "/tmp/ttyV2")

data = UInt8[0x01, 0x02, 0x03]
COM.transmit(com, "/tmp/ttyV2", data)
received = COM.receive(com, "/tmp/ttyV3", length(data))

Завершение работы

COM.close(com, port_send)
COM.close(com, port_recv)
println("Порты закрыты")

Особенности

  • Порядок работы: initopentransmit/receiveclose. init только сохраняет конфигурацию, реальное открытие происходит в open.

  • COM.receive — блокирующий вызов: метод ожидает, пока в буфере порта не накопится bytes_to_read байт или не истечет внутренний таймаут.

  • Один COM-объект может управлять несколькими портами: нициализируйте, открывайте и закрывайте их по имени.

  • COM.transmit возвращает количество фактически отправленных байт — при нормальной работе оно равно длине message.