Программное управление COM
На этой странице представлены все доступные функции программного управления CAN в Engee.
|
Чтобы работать с функциями программного управления COM в Engee, установите пакет поддержки оборудования как указано в статье. После выполните:
Далее необходимо создать COM-объект:
|
#
Main.EngeeDeviceManager.Devices.COM.close — Method
COM.close(device, port::String)
Закрывает COM-порт и освобождает ресурсы.
Аргументы
-
device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект. -
port::String: название порта.
#
Main.EngeeDeviceManager.Devices.COM.get_devices — Method
COM.get_devices(device) → Vector{String}
Возвращает список доступных COM-портов (например, ["COM1", "COM3", "/dev/ttyUSB0"]).
Аргументы
-
device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект.
#
Main.EngeeDeviceManager.Devices.COM.init — Method
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 стоп-бита.
-
#
Main.EngeeDeviceManager.Devices.COM.open — Method
COM.open(device, port::String)
Открывает COM-порт с заданной конфигурацией.
Аргументы
-
device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект. -
port::String: название порта.
#
Main.EngeeDeviceManager.Devices.COM.receive — Method
COM.receive(device, port::String, bytes_to_read::Int64) → Vector{UInt8}
Читает указанное число байт из порта.
Аргументы
-
device::Main.EngeeDeviceManager.Devices.COM.ComType: COM-объект. -
port::String: название порта. -
bytes_to_read::Int64: количество байт для чтения.
#
Main.EngeeDeviceManager.Devices.COM.transmit — Method
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("Порты закрыты")
Особенности
-
Порядок работы:
init→open→transmit/receive→close.initтолько сохраняет конфигурацию, реальное открытие происходит вopen. -
COM.receive— блокирующий вызов: метод ожидает, пока в буфере порта не накопитсяbytes_to_readбайт или не истечет внутренний таймаут. -
Один COM-объект может управлять несколькими портами: нициализируйте, открывайте и закрывайте их по имени.
-
COM.transmitвозвращает количество фактически отправленных байт — при нормальной работе оно равно длинеmessage.