自定义类UART信号捕获咨询:16位接收器配置可行性
嘿,我来帮你理清这个问题的关键点~
一、“16位UART”具备合理性吗?
完全合理!标准UART虽然通常只支持5-8位数据位,但自定义扩展数据位长度的类UART协议在工业、嵌入式场景里非常常见。比如很多传感器、专用设备会把数据位设为16位,这样单次就能传输完整的16位寄存器值、ADC采样结果这类数据,避免拆分两次传输带来的额外开销和同步问题。你的帧结构(1起始+16数据+1停止)本质还是异步串行通信的逻辑,只是数据位长度做了扩展,完全是合理的设计。
二、配置16位接收器可行吗?
可行,但不能依赖常规的串口库(比如termios、boost asio),原因和解决方案如下:
1. 常规库失效的原因
termios和boost asio的serial_port都是基于通用UART硬件驱动开发的,而绝大多数商用UART硬件(比如PC的串口芯片、普通MCU的UART外设)默认只支持最多8位数据位,驱动层也没有暴露16位的配置选项,所以这些库自然没法直接接收16位数据帧。
2. 可行的实现方案
软件模拟UART(Bit-Banging)
这是最适合你的方案,因为你已经明确知道每比特时长是8-9μs。核心思路是:- 用GPIO引脚监听信号,检测到低电平起始位后启动定时器;
- 每个比特的中间时刻进行采样(比如起始位下降沿后4-4.5μs采第一个数据位,之后每隔8-9μs采样一次,共16次);
- 最后验证停止位是否为高电平,完成一帧数据的捕获。
注意:如果是在PC上做,用户态程序的时序精度可能不够(容易被系统调度打断),建议用嵌入式平台(比如STM32、Raspberry Pi)或者内核态程序,配合硬件定时器中断来保证采样时机的准确性。
自定义硬件捕获
如果是嵌入式项目,可以选择支持可配置数据位长度的MCU(部分高端MCU的UART外设支持16位数据位),或者用FPGA来实现自定义的UART接收器,直接硬件完成帧解析,再把数据传给主机。修改底层驱动(不推荐)
如果你必须用termios这类框架,理论上可以修改串口驱动代码,添加16位数据位的支持,但这个方案难度大、通用性差,只适用于特定硬件,性价比很低。
3. 手动C程序失败的可能原因
你之前手动编写的C程序无法正确采样,大概率是时序精度不足——用户态程序会被操作系统的进程调度打断,导致采样点偏移,错过正确的比特位。解决办法是改用实时调度策略、内核态程序,或者依赖硬件定时器中断来触发采样操作。
内容的提问来源于stack exchange,提问作者nfls

