嵌入式 Linux 中 UART 上的 9 位协议

Posted

技术标签:

【中文标题】嵌入式 Linux 中 UART 上的 9 位协议【英文标题】:9 bit protocol on UART in embedded Linux 【发布时间】:2015-01-09 08:01:35 【问题描述】:

我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议。目前我正在 am335x_evm 板上对此进行测试。我打算使用棒奇偶校验来做到这一点。理想情况下,我希望我不需要实际修改 omap-serial.c 驱动程序的任何代码。

使用 9 位协议的原因是为了支持一些使用它的旧硬件。奇偶校验位需要为消息的地址部分为 1,为数据部分为 0,然后为终止字节再次为 1。

我计划在用户空间运行一个进程,该进程将通过标准系统调用(打开、写入、读取、ioctl、tcsetattr 等)与 UART 交互。我将配置 UART 以启用奇偶校验并设置棒奇偶校验。然后我将奇偶校验设置为偶数并调用 write() 来发送我的地址数据。然后我会将奇偶校验设置为 0 并发送数据。我担心的是,如果我将奇偶校验从 1 更改为 0,什么时候会生效?如果 UART 没有完成发送所有地址数据,奇偶校验的变化是否适用于任何未发送的数据?

【问题讨论】:

这是一个很好的问题。您始终可以刷新通道,但这会在您的地址和数据之间引入轻微的延迟,您的外围设备可能无法理解。 冲洗可能不是一个坏主意。我会记住这一点。不过,您对延迟是正确的。消息的接收者只会等待很短的时间,然后丢弃他们所拥有的。 另一种选择是编写自己的串行line discipline驱动程序。这不是世界上最简单的事情,但也不是最难的。这允许您通过 ioctl(以及可能的读/写)一次向/从用户空间发送消息,而不是字节流。然后学科驱动程序可以从内核空间获得更多访问权限。这种方法也将极大地帮助您接收消息。 类似的东西将成为我的后备选项。要使用 ioctl 将我需要的内容发送到 uart 驱动程序中,那么在较低级别我将拥有更多控制权。 如果没有支持 9 位的 UART,您可以想出一个方案来传输 8 位数据以及强制 0 或 1 奇偶校验作为第 9 个数据位。但是接收要困难得多,需要修改驱动程序,需要编程的 I/O(即没有 DMA),并且需要在接收时暂停传输。简化描述在digital.ni.com/public.nsf/allkb/…。 【参考方案1】:

如果硬件和驱动程序支持,正确的方法是在您的串行端口上设置cs9(可能没有奇偶校验)。

我会为你搜索链接...

【讨论】:

谢谢,但是 TI Sitara 芯片(avm335X_evm 上的那个)上的 UART 不支持 CS9。因此,我为什么要尝试坚持平价路线。【参考方案2】:

最终编写了我自己的 9 位 uart 驱动程序。是最简单、最有效的解决方案。

【讨论】:

你能把源码分享给社区吗?我也想用9位的uart,好像全世界人也不少啊! 是的,这里也一样。那太棒了 我也很好奇看到这个,我一直在尝试这个,我已经弄清楚了 Tx 我相信但 Rx 似乎要困难得多,或者我忽略了一些微不足道的事情...任何指导都会很棒!

以上是关于嵌入式 Linux 中 UART 上的 9 位协议的主要内容,如果未能解决你的问题,请参考以下文章

单片机常用通信协议-UART和USART

移位与数组索引,更适合 32 位 MCU 上的 uart 接口

使用 /dev/tty* 进行 9 位 uart 仿真

UART接口

基于STM32之UART串口通信协议发送

STM32F407-串口学习1(UART协议简介)