Перейти к содержанию
Материалы раздела

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.UART0UART0
uart.UART1UART1
uart.UART2UART2
uart.CONSOLEКонсольный UART

Паритет

КонстантаОписание
uart.PARNONEБез паритета
uart.PAREVENЧетный паритет
uart.PARODDНечетный паритет

Стоп-биты

КонстантаОписание
uart.STOPHALF0.5 стоп-бита
uart.STOP11 стоп-бит
uart.STOP22 стоп-бита

Режим подключения

КонстантаОписание
uart.READИспользовать только RX.
uart.WRITEИспользовать только TX.

Для одновременного чтения и записи передайте uart.READ | uart.WRITE; это значение используется по умолчанию.

RS485 активный уровень DE

КонстантаЗначениеОписание
uart.DE_ACTIVE_LOW0DE=0 для передачи
uart.DE_ACTIVE_HIGH1DE=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)