4

我有一个通过 Prolific Serial 到 USB 电缆连接的硬件,我需要使用 socat 向/从这个和 TCP 端口发送/接收流量。到目前为止,它已安装并与 minicom 一起使用:

minicom -D /dev/tty.usbserial -b 9600

Socat 使用以下方式向 TCP 端口单向工作:

socat /dev/tty.usbserial,clocal=1,nonblock=1,cread=1,cs8,ixon=1,ixoff=1 TCP4:localhost:8080

我如何让它以两种方式工作?我经常看到重复的字符或双行,这表明串行设置不正确,对吗?

谢谢!克里斯

编辑:一些示例代码(实际上并不以双向方式工作)。

Chris-MacBookAir:~ chrisbridges$ socat -d -d - /dev/tty.usbserial,clocal=1,nonblock=1,cs8,ixon=1,ixoff=1,ispeed=9600,ospeed=9600,icanon=1
2013/01/09 13:13:34 socat[8501] N reading from and writing to stdio
2013/01/09 13:13:34 socat[8501] N opening character device "/dev/tty.usbserial" for reading and writing
2013/01/09 13:13:34 socat[8501] N starting data transfer loop with FDs [0,1] and [3,3]
4

2 回答 2

4

谢谢您的帮助。我现在已经解决了,可以正常沟通了。Socat 确实是一个复杂的工具。这是我的最终设置:

sudo socat -U -d -d -d /dev/tty.usbserial,clocal=1,cs8,nonblock=1,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,raw,echo=0,crtscts=0 FILE:tnc-start.hex

其中 'ixon' 启用 XON/XOFF 流控制,'ixoff' 启用发送开始/停止字符,有趣的是,'echo' 不会打印到控制台,但会回显在发送者处传回的任何内容......奇怪!

于 2013-03-27T15:06:11.870 回答
4

我很可能会告诉你很多你已经知道的东西,但是调试这种情况通常会带来完整的画面。

问题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同步机制。让我们将双向通信分解为两个方向:

  • DTE (Mac) => DCE(一块硬件):DTE 激活 RTS(请求发送)线,并等待直到 DCE 激活 CTS(清除发送)线。然后它发送数据。

  • DCE (piece of hw) => DTE (Mac):DCE 激活 DSR(数据集就绪)线,并等待直到 DTE 激活 DTR(数据终端就绪)线。然后它发送数据。

从您的设置(minicomsocat)判断,您可能正在使用某种外壳管道/重定向,所以我不知道您如何从外壳读取电线的状态(尽管,它必须是可能的)。对于像我这样的 shell/OS 架构外行来说,这是一个非常好的问题,但不幸的是我没有 DCE 可以尝试:(

使用像Java 简单串行连接器这样的程序库,它变得像读取布尔变量的值一样简单。

问题 2:适配的串行通信(RS-232 转 USB)

我看到了其中两个(不同的供应商) ,带有 RS-232 和 USB 连接器电缆和一个硬件适配器,通常在串行连接器端。除了“serial-to-usb”短语外,他们没有任何手册,也没有任何行为声明。其中一个没有按预期工作,例如它没有正确传输电线的状态,尽管它是“串行到USB”。在这种情况下没什么可做的,但要获得一个有效的。

结论

一旦字节到达 TCP 端口,它们将被正确传输。由于 socat 是一个非常复杂的程序,您可能错误地配置了它。重复的行和字符比串行连接错误配置更能说明问题。但是,由于您说 TCP 端口的“硬件”有效,这也可能意味着来自 TCP 端口的数据配置错误。

但是,首先您必须确保您知道与您的“硬件”通信的协议,因此我建议尝试模拟来自 TCP 端口的数据并将其直接发送到串行端口。例如,编写一个带有一些基本命令的 shell 脚本或程序,这些命令可以直接通过串行端口与您的“硬件”进行通信。如果这被证明符合预期,那么您就知道问题出在 socat 中,或者更有可能是来自 TCP 端口的数据。我希望你有一本关于你的“硬件”的手册:)

请反馈。

于 2013-01-10T00:40:32.000 回答