我很可能会告诉你很多你已经知道的东西,但是调试这种情况通常会带来完整的画面。
问题1:经典串行通信(纯RS-232)
来自维基百科的串口:
在计算中,串行端口是一种串行通信物理接口,信息通过它一次传入或传出一位(与并行端口相比)(...)术语“串行端口”通常表示硬件或多或少兼容符合 RS-232 标准,旨在与调制解调器或类似的通信设备连接。(...)
来自RS-232 的维基百科:
在电信领域,RS-232 是一系列标准的传统名称,用于连接 DTE(数据终端设备)和 DCE(数据电路终端设备)之间的串行二进制单端数据和控制信号( ... )
因此,DTE 是您的 Mac,而 DCE 是“硬件”。要设置串行连接,您需要设置以下参数:
- baudrate - 可以达到的最大数据发送速度
- 数据位 - 许多位将组成一个字符
- 停止位 - 流同步
- 奇偶校验 - 错误检查
例如,某些 POS 外围设备的常用值是 9600/8/1/none,但唯一相关的是DCE和 DTE必须对这些参数具有相同的值才能按预期运行。Mac/PC 可以使用任何预定义的值,因此您需要查看“硬件”的手册以查看要选择的值。
如果这两种设备中的一个具有更大的波特率设置,您将在另一侧看到垃圾数据。此外,接收到的垃圾数据的大小将小于原始发送的数据大小。如果数据位设置不同,您还应该看到垃圾数据但大小相同。我不确定如果停止位或奇偶校验不同会发生什么。
最重要的是——你需要知道你的硬件的协议——可能是详细的——以使其按预期运行。一般来说,RS-232 通信是指 DCE 和 DTE 都处理一些数据,然后通过串行电缆发送一些数据(双向通信)。
然而,虽然我们现在习惯于在 DTE 端进行多任务处理,但在 DCE 端可能并非如此——您的“硬件”可能在处理数据时无法在其串行端口上侦听,反之亦然。这意味着,如果您在它忙于处理其他数据时尝试向它发送一些数据 - 它不会收到它。
由于 RS-232 比多任务处理更老 - 考虑到它们广泛使用的时间,它更老 -正确的方法是使用 RS-232同步机制。让我们将双向通信分解为两个方向:
从您的设置(minicom,socat)判断,您可能正在使用某种外壳管道/重定向,所以我不知道您如何从外壳读取电线的状态(尽管,它必须是可能的)。对于像我这样的 shell/OS 架构外行来说,这是一个非常好的问题,但不幸的是我没有 DCE 可以尝试:(
使用像Java 简单串行连接器这样的程序库,它变得像读取布尔变量的值一样简单。
问题 2:适配的串行通信(RS-232 转 USB)
我看到了其中两个(不同的供应商) ,带有 RS-232 和 USB 连接器的电缆和一个硬件适配器,通常在串行连接器端。除了“serial-to-usb”短语外,他们没有任何手册,也没有任何行为声明。其中一个没有按预期工作,例如它没有正确传输电线的状态,尽管它是“串行到USB”。在这种情况下没什么可做的,但要获得一个有效的。
结论
一旦字节到达 TCP 端口,它们将被正确传输。由于 socat 是一个非常复杂的程序,您可能错误地配置了它。重复的行和字符比串行连接错误配置更能说明问题。但是,由于您说 TCP 端口的“硬件”有效,这也可能意味着来自 TCP 端口的数据配置错误。
但是,首先您必须确保您知道与您的“硬件”通信的协议,因此我建议尝试模拟来自 TCP 端口的数据并将其直接发送到串行端口。例如,编写一个带有一些基本命令的 shell 脚本或程序,这些命令可以直接通过串行端口与您的“硬件”进行通信。如果这被证明符合预期,那么您就知道问题出在 socat 中,或者更有可能是来自 TCP 端口的数据。我希望你有一本关于你的“硬件”的手册:)
请反馈。