我正在测试两个设备之间的 RS-232 通信(1:Red Hat Linux,2:Windows)
我可以检查发送和接收数据。在Windows中,可以通过串行通信程序进行检查,在Linux中,可以通过终端轻松检查。对 RS-232 通信进行相同的基本设置后,我尝试发送和接收数据。
如果数据从Linux设备发送到Windows设备,我可以检查它是否已在Windows通信程序中接收。相反,如果数据从 Windows 设备发送到 Linux 设备,尽管执行了 ,但它不会出现在终端上cat /dev/ttySX
。
我输入的测试RS232数据发送和接收的命令如下。
dmesg | grep ttyS
#output:
ttyS0 at MMIO 0xdf301000 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS1 at MMIO 0xdf301400 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS2 at MMIO 0xdf301800 (irq = 126, base_baud = 7812500) is XR17V35X --> real usage
ttyS3 at MMIO 0xdf301c00 (irq = 126, base_baud = 7812500) is XR17V35X
setserial /dev/ttyS2 uart 8250
# Output
ttyS0 UART:undefined Port:0x0000
ttyS1 UART:undefined Port:0x0000
ttyS2 UART:8250 Port:0x0000 ---> Why port is 0x0000?
ttyS3 UART:undefined Port:0x0000
stty -F /dev/ttyS2 115200 cs8 -cstopb -parenb
打开两个终端并分别执行以下命令:
1号航站楼:
cat /dev/ttyS2" (or "cat < /dev/ttyS2")
2 号航站楼:
echo -e -n \x2\x3\x1\x0\x0\x0\x0\x3 > /dev/ttyS2
从终端2发送的数据在Windows设备的串口通信程序中接收良好,但是从Windows设备发送的数据没有出现在终端1上。但是,当我没有说时cat /dev/ttyS2
,我只从Windows串口发送了它程序,但是当我命令时cat /dev/ttyS2
,我也收到了响应。
问题:如果我想显示收到的数据怎么办cat /dev/ttyS2
?端口 0x0000 是什么意思?
谢谢您阅读此篇。
答案1
如果我想显示收到的数据怎么办
cat /dev/ttyS2
?
您使用的工具可能不太适合您的目的。虽然cat
概念上非常简单,但其实现可能一点也不简单。
cat
可能被设计为主要操作块设备上的文件,因此它可以缓冲其输入和输出。它最初可能会处理任何少量可用的数据(以便与假设来自面向块的设备的输入流“同步”),并且当该数据已被处理并cat
被迫等待时对于更多数据,它将等待更大的数据块到达,然后再一次处理所有数据,以提供高效的文件系统输入/输出。
这个问题表示 GNUcat
可能使用大小至少为 128 KiB 的缓冲区。
其他实现的cat
(非?)缓冲行为可能非常不同。
您可以使用专门设计用于专门处理串行端口的单个实用程序,例如minicom
(可以在 RHEL 标准包集合中找到),而不是使用两个单独的终端和通用命令。如果您想要更简单/更简约的东西,EPEL 存储库应该有picocom
(Github 和描述在这里)。
这些程序不会做出任何面向块的假设,并且还将“知道”如何确保终端的 PTY 设备不会因另一层缓冲而导致传入数据延迟。
端口 0x0000 是什么意思?
PC 架构的原始 8250 UART 使用端口映射 I/O,本质上是为 I/O 端口使用单独的地址空间,并使用专用的 CPU 指令来使用它。由于这在很长一段时间内一直是常态,Linux 工具就setserial
假设每个 8250 兼容的 UART 都位于某个端口地址中。
然而,您的现代 XR17V35X UART 芯片向后兼容 8250,但设计用于使用内存映射 I/O因为 PCIe 总线实际上不再具有单独的 I/O 地址空间,并且在现代系统上,内存映射 I/O 往往更高效:而不是使用遗留inp
和out
指令来访问 I/O 地址空间, UART 的寄存器可以通过与内存一起使用的相同的正常、高度优化的 CPU 指令进行访问。
当消息ttyS2 at MMIO 0xdf301800 ...
登录时dmesg
,它指示 XR17V35X UART 已映射到的物理/总线地址。内存映射的 UART 将没有端口地址,因此更合适的说法是setserial
,例如Port: n/a
指示端口地址的概念不适用于该特定的 UART,和/或显示类似的内容MMIO:0xdf301800
。