c - 初始化与 c 库 open() 的串行通信导致 TX 在 RPi 上发送一位

标签 c serial-port raspberry-pi

我正在尝试在 RPI 和 FPGA 之间建立串行通信。但是,在使用标准 C 库 open() 初始化串行接口(interface)时存在一个问题:我正在使用示波器来监视通过 RX 和 TX 线路发送和接收的内容。调用 open 会导致 RPI 的 TX 线变低一个位的长度。我没有在其他计算机/Linux PC 上看到这种行为。关键是,FPGA 假设传输有效,因为他认为这是一个起始位,但事实并非如此。

我检查了安装在 RPI 上的 minicom。一样。启动 minicom 会导致 TX 线发送一位。一旦 minicom 启动,通信就会按预期运行并且所有字节都具有正确的帧大小。有什么方法可以抑制 TX 线在打开调用初始化串行通信时变低吗?这是预期的行为吗?

最佳答案

这是一个 super 牵强的预感,但是this code似乎有点可疑,来自 PL011 serial port driver 中的 pl011_startup() 函数:

/*
 * Provoke TX FIFO interrupt into asserting.
 */

似乎在启动端口时似乎在转动 TX 线,这可以解释您看到的脉冲。当然,在得出结论之前肯定需要进行更多调查。

所以,我想我的“答案”可以归结为:这听起来很奇怪,也许是司机的问题?

当然,解决此问题的一种方法是在 FPGA 端多加注意,前提是您可以更好地控制它。 “适当的”框架会解决这个问题,并明确表示可以丢弃虚假发送。

更新:我的意思是如果“正确的”消息总是由一些字节序列构成,FPGA 可能无论如何都能够丢弃无效(“未成帧”)数据,从而成为免疫随机脉冲。例如,消息可以定义为始终以 SOH( header 开始)或 SOT(文本开始)符号(分别为 bytes with the values 0x01 and 0x02)开头。

关于c - 初始化与 c 库 open() 的串行通信导致 TX 在 RPi 上发送一位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579974/

相关文章:

c++ - 面向对象编程

c - C语言扑克软件原型(prototype),找出顺子功能的问题

c - 在 C 中测试 linux CAP_FOWNER 功能?

当串行设备的路径改变时,C 程序停止

linux - Raspberry Pi NFC 标签仿真

android - WifiManager startScan() 仅在第一次工作

c - printf ("%d",i++) 和 i++ 有什么区别; printf ("%d",i)?

c++ - 我无法从串口发送连续数据

linux - Linux 上通过 TCP 的虚拟串口

c++ - valgrind 在 Raspberry Pi 上返回未处理的指令