
1. UART 是什么UART通用异步收发器是最常用的串行通信接口通过两根线完成全双工通信TX发送线。RX接收线。UART 不需要时钟线通信双方通过约定相同的波特率、数据位、停止位和校验位来保证通信正确。2. UART 一帧数据起始位(0) → 数据位(常用 8 位) → 校验位(可选) → 停止位(1)常见配置为115200、8 数据位、无校验、1 停止位即常说的115200-8-N-1。若两端的波特率、数据位、停止位或校验方式不一致就可能出现乱码或无法通信。3. RT-Thread 串口设备模型应用程序 ↓ I/O 设备管理接口 ↓ UART 驱动框架 ↓ 芯片 UART 驱动 ↓ UART 硬件串口设备通常命名为uart0、uart1、uart2等。应用层通过统一的rt_device_*()接口完成查找、配置、打开、读写和关闭。4. 串口收发模式模式特点轮询实现简单但 CPU 会等待收发完成。中断收到数据时触发中断适合普通异步数据。DMA大块、频繁数据传输时可减少 CPU 占用。打开串口时接收和发送模式只能分别选择一种未指定中断或 DMA 时默认使用轮询。5. 配置并打开串口#define UART_NAME uart2 rt_device_t serial; struct serial_configure config RT_SERIAL_CONFIG_DEFAULT; serial rt_device_find(UART_NAME); if (serial ! RT_NULL) { config.baud_rate BAUD_RATE_9600; config.data_bits DATA_BITS_8; config.stop_bits STOP_BITS_1; config.parity PARITY_NONE; config.bufsz 128; rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, config); rt_device_open(serial, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM); }代码解析RT_SERIAL_CONFIG_DEFAULT先加载默认配置再按需修改。rt_device_find()获取设备句柄返回RT_NULL表示设备名错误或驱动未注册。rt_device_control()应在open前完成尤其是bufsz中断接收缓冲区会在打开时创建打开后不能动态修改其大小。RT_DEVICE_FLAG_INT_RX选择中断接收RT_DEVICE_FLAG_STREAM会在输出\n前自动补\r便于串口终端换行。6. 中断接收回调通知线程读取static struct rt_semaphore rx_sem; static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { rt_sem_release(rx_sem); return RT_EOK; } static void uart_thread(void *parameter) { char ch; while (1) { while (rt_device_read(serial, -1, ch, 1) ! 1) { rt_sem_take(rx_sem, RT_WAITING_FOREVER); } rt_kprintf(received: %c\n, ch); } } /* 串口打开后初始化同步对象并注册接收通知 */ rt_sem_init(rx_sem, rx_sem, 0, RT_IPC_FLAG_FIFO); rt_device_set_rx_indicate(serial, uart_input);代码解析rt_device_set_rx_indicate()将uart_input()注册给串口驱动。串口收到数据后驱动调用该回调回调中只释放信号量不做耗时处理。接收线程先尝试读取 1 字节若缓冲区没有数据就阻塞等待rx_sem被回调唤醒后再次读取。这样将复杂处理放在线程中避免在中断上下文中阻塞或延时。pos对串口没有意义通常传-1或0。7. RS-485 与 UART 的关系RS-485 是一种适合工业现场的差分通信标准使用 A/B 两根差分线传输数据。它通常通过UART RS-485 收发器芯片实现UART 负责收发字节RS-485 芯片负责将 TTL 电平转换为差分信号。主要特点抗干扰能力强适合工业环境。传输距离可达约 1200m速率与距离成反比。一条总线可连接多个节点。常用两线半双工同一时刻只能发送或接收。长距离总线通常需要在末端加 120Ω 终端电阻以减少信号反射。8. RS-485 方向控制RS-485 芯片常将RE、DE接到同一个 GPIO 控制EN 高电平发送模式 EN 低电平接收模式课件的板级描述中出现了 PA1 与 PB11 两种 EN 引脚信息示例代码使用GET_PIN(A, 1)。实际开发务必以开发板原理图和 BSP 配置为准。#define EN_485 GET_PIN(A, 1) static int rs485_send(void) { char msg[] hello RT-Thread!\r\n; rt_pin_write(EN_485, PIN_HIGH); rt_device_write(uart_485, 0, msg, rt_strlen(msg)); rt_pin_write(EN_485, PIN_LOW); return RT_EOK; }代码解析发送前先将EN_485拉高使收发器切换到发送状态rt_device_write()将字符串写入 UART发送结束后拉低 EN重新进入接收状态。使用课件中的“中断接收、轮询发送”方式时可按此思路处理若改为 DMA 或中断发送不能在调用写接口后立即切回接收应在发送完成回调中再拉低 EN否则最后的数据可能尚未发完。初始化 RS-485 时还需将 EN 配为输出并默认置低rt_pin_mode(EN_485, PIN_MODE_OUTPUT); rt_pin_write(EN_485, PIN_LOW);代码解析PIN_MODE_OUTPUT允许 GPIO 驱动收发器方向引脚初始化为低电平可让设备默认处于接收状态避免上电后长期占用总线。总结UART 负责异步字节收发RS-485 则让 UART 能在远距离、强干扰、多节点环境中稳定通信。RT-Thread 中可将串口接收组织为串口中断 → 接收回调释放信号量 → 接收线程读取并处理数据RS-485 在此基础上额外增加一个方向控制 GPIO发送前切换为发送发送完成后切回接收。