UART
UART-устройства кодируются в байт и зависят от платформы. Модуль UART определяет числовую константу для каждого доступного UART-устройства. Например, на ESP32 UART1 определяется константой uart.UART1. Доступные UART-устройства указаны в документации платформы или платы. При обращении к несуществующему UART возвращается nil.
Функции UART не потокобезопасны. При доступе из нескольких потоков используйте функции блокировки и разблокировки.
uart.pins([table])
Показывает выводы, назначенные портам UART. Начальные назначения зависят от модели устройства. При необходимости измените их с помощью функции uart.setpins до подключения UART.
Аргументы:
- table: если true, список пинов возвращается в таблице Lua, если false — список пинов выводится в консоль.
Возвращает:
если table равно false: ничего или исключение.
если table равно true: таблицу Lua со списком пинов или исключение. Эта таблица представляет собой массив таблиц. Каждая запись соответствует порту UART. Каждый порт предоставляет следующие поля:
- id: идентификатор порта UART.
- rx: номер GPIO, назначенный сигналу приема (rx).
- tx: номер GPIO, назначенный сигналу передачи (tx).
/ > uart.pins()
UART0: rx=GPIO3 tx=GPIO1
UART1: rx=GPIO26 tx=GPIO25
UART2: rx=GPIO2 tx=GPIO15
uart.setpins(id, rx, tx)
Устанавливает пины, назначенные порту UART. Используйте эту функцию, если вам нужно изменить начальные назначения.
Аргументы:
- id: идентификатор устройства UART. Используйте любую константу uart.UARTx для этой цели.
- rx: номер GPIO, назначенный сигналу приема (rx). Используйте любую константу pio.GPIOxx для этого.
- tx: номер GPIO, назначенный сигналу передачи (tx). Используйте любую константу pio.GPIOxx для этого.
baud = uart.attach(id, baud rate, data bits, parity, stop bits, [buffer size, flags])
Подключить устройство UART к модулю UART.
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
- baud rate (скорость передачи): желаемая скорость передачи, выраженная в бодах.
- data bits (биты данных): количество бит данных от 5 до 8.
- parity (паритет): паритет, может быть uart.PARNONE (без паритета), uart.PAREVEN (четный паритет) или uart.PARODD (нечетный паритет).
- stop bits (стоп-биты): количество стоп-битов, может быть uart.STOP1 (1 стоп-бит) или uart.STOP2 (2 стоп-бита).
- buffer size (размер буфера, необязательно): размер буфера приема UART, выраженный в байтах. Если вы не указываете значение, используется буфер на 1024 байта.
- flags (флаги, необязательно): битовая маска, составленная из следующих констант:
- uart.READ: подключить устройство UART только для чтения (используется только RX).
- uart.WRITE: подключить устройство UART только для записи (используется только TX).
- значение по умолчанию uart.READ | uart.WRITE: подключить устройство UART для чтения/записи (используются RX и TX).
Возвращает: реальную установленную скорость передачи на устройстве UART или исключение. Это значение может отличаться от желаемой скорости передачи.
-- Attach an UART device to UART2, 115200 bps, 8N1
local actual_baud = uart.attach(uart.UART2, 115200, 8, uart.PARNONE, uart.STOP1)
print(actual_baud)
uart.lock(id)
Блокировать UART вызывающим потоком.
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: ничего или исключение.
-- Lock the console
uart.lock(uart.CONSOLE)
-- ...
-- Unlock the console
uart.unlock(uart.CONSOLE)
uart.unlock(id)
Разблокировать UART вызывающим потоком.
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: ничего или исключение.
-- Lock the console
uart.lock(uart.CONSOLE)
-- ...
-- Unlock the console
uart.unlock(uart.CONSOLE)
uart.write(id, data)
Записать данные в устройство UART. Данные могут быть байтом (сырые данные) или строкой.
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
- data (string): данные для записи, строка.
Возвращает: ничего или исключение.
-- Attach an UART device to UART2, 115200 bps, 8N1
uart.attach(uart.UART2, 115200, 8, uart.PARNONE, uart.STOP1)
-- Sends AT
uart.write(uart.UART2, "AT")
uart.read(id, format, [timeout], [bytes], [del])
Читать данные из устройства UART.
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
- format (формат): строка, указывающая формат типа данных для чтения. Может быть “*l” для чтения строки без ожидания символа конца строки, “*el” для чтения строки до получения символа конца строки, “*nl” для чтения строки до получения заданного (параметром bytes) количества символов, “*cl” для чтения строки до получения специального символа-разделителя, с ограничением длины (параметром bytes) количества символов или “*c” для чтения 1 байта.
- timeout (тайм-аут): общий тайм-аут всей операции в миллисекундах, а не отдельный тайм-аут каждого байта. Положительное значение, меньшее одного системного тика, округляется до одного тика.
- bytes (только для режима “*nl, *cl”): количество байт для чтения. По умолчанию 1.
- del (только для режима *cl): символ разделитель. По умолчанию: 0. Возвращает: для всех режимов, кроме “*c” - прочитанные данные в виде строки (для “*c” - число), или nil, если ничего не получено в указанный тайм-аут, или исключение.
-- Attach an UART device to UART2, 115200 bps, 8N1
uart.attach(uart.UART2, 115200, 8, uart.PARNONE, uart.STOP1)
-- Read line from UART, with a 500 milliseconds timeout
uart.read(uart.UART2, "*l", 500)
uart.consume(id)
Удалить все байты, присутствующие в очереди UART, не выполняя с ними никаких действий.
Аргументы:
- id: идентификатор модуля UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: ничего или исключение.
-- Attach an UART device to UART2, 115200 bps, 8N1
uart.attach(uart.UART2, 115200, 8, uart.PARNONE, uart.STOP1)
-- Do something
-- ...
-- Consume all bytes from buffer
uart.consume(uart.UART2)
uart.setrs485(id, de_pin [, de_level])
Настроить режим RS485 half-duplex с автоматическим управлением пином направления (DE/RE).
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
- de_pin: номер GPIO для управления направлением передачи (DE/RE пин трансивера RS485). Установите -1 для отключения режима RS485.
- de_level (необязательно): активный уровень пина DE. По умолчанию uart.DE_ACTIVE_HIGH (1).
- uart.DE_ACTIVE_HIGH (1): DE=1 для передачи, DE=0 для приема
- uart.DE_ACTIVE_LOW (0): DE=0 для передачи, DE=1 для приема
de_pin должен поддерживать выход и отличаться от RX и TX этого UART. При
включённых аппаратных блокировках назначение выполняется только после успешной
блокировки GPIO. При замене или отключении режима прежний GPIO переводится в
неактивное состояние, сбрасывается и освобождается.
Возвращает: ничего или исключение.
-- Attach an UART device to UART2, 9600 bps, 8N1
uart.attach(uart.UART2, 9600, 8, uart.PARNONE, uart.STOP1)
-- Enable RS485 mode with DE pin on GPIO4, active high
uart.setrs485(uart.UART2, 4, uart.DE_ACTIVE_HIGH)
-- Now uart.write() will automatically control DE pin
uart.write(uart.UART2, "Hello RS485!")
-- Read response
local response = uart.read(uart.UART2, "*l", 1000)
-- Disable RS485 mode
uart.setrs485(uart.UART2, -1)
uart.isrs485(id)
Проверить, включен ли режим RS485 для данного UART.
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: true если режим RS485 включен, false в противном случае.
if uart.isrs485(uart.UART2) then
print("RS485 mode is enabled")
end
uart.available(id)
Получить количество байт, доступных для чтения в буфере приема UART.
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: количество байт в буфере или исключение.
-- Check how many bytes are available
local n = uart.available(uart.UART2)
if n > 0 then
local data = uart.read(uart.UART2, "*nl", 100, n)
print("Received: " .. data)
end
uart.flush(id)
Очистить буфер приема UART (удалить все непрочитанные данные).
Аргументы:
- id: идентификатор устройства UART. Используйте uart.UARTx, определенный для этой цели.
Возвращает: ничего или исключение.
-- Clear RX buffer before sending command
uart.flush(uart.UART2)
uart.write(uart.UART2, "AT\r\n")
local response = uart.read(uart.UART2, "*l", 1000)
Константы
Идентификаторы UART
| Константа | Описание |
|---|---|
| uart.UART0 | UART0 |
| uart.UART1 | UART1 |
| uart.UART2 | UART2 |
| uart.CONSOLE | Консольный UART |
Паритет
| Константа | Описание |
|---|---|
| uart.PARNONE | Без паритета |
| uart.PAREVEN | Четный паритет |
| uart.PARODD | Нечетный паритет |
Стоп-биты
| Константа | Описание |
|---|---|
| uart.STOPHALF | 0.5 стоп-бита |
| uart.STOP1 | 1 стоп-бит |
| uart.STOP2 | 2 стоп-бита |
Режим подключения
| Константа | Описание |
|---|---|
| uart.READ | Использовать только RX. |
| uart.WRITE | Использовать только TX. |
Для одновременного чтения и записи передайте uart.READ | uart.WRITE; это
значение используется по умолчанию.
RS485 активный уровень DE
| Константа | Значение | Описание |
|---|---|---|
| uart.DE_ACTIVE_LOW | 0 | DE=0 для передачи |
| uart.DE_ACTIVE_HIGH | 1 | DE=1 для передачи (по умолчанию) |
Пример: Modbus RTU через RS485
-- Setup UART2 for Modbus RTU at 9600 baud
uart.attach(uart.UART2, 9600, 8, uart.PARNONE, uart.STOP1)
-- Configure RS485 mode with DE pin on GPIO4
uart.setrs485(uart.UART2, 4, uart.DE_ACTIVE_HIGH)
-- Function to send Modbus request and receive response
function modbus_request(request)
uart.flush(uart.UART2)
uart.write(uart.UART2, request)
-- Wait for response (adjust timeout as needed)
tmr.delayms(50)
local n = uart.available(uart.UART2)
if n > 0 then
return uart.read(uart.UART2, "*nl", 100, n)
end
return nil
end
-- Example: Read holding registers (function 03)
local request = string.char(0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A)
local response = modbus_request(request)