使用socat在Mac上的USB串行端口

时间:2013-01-09 13:00:29

标签: macos serial-port usb tty socat

我有一块通过Prolific Serial to 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]

2 个答案:

答案 0 :(得分:4)

我很可能告诉你很多你已经知道的东西,但是调试这种情况通常会让人感觉完整。

问题1:经典串行通信(纯RS-232)

来自维基百科serial port

  

在计算中,串行端口是一个串行通信物理接口,通过该接口,信息一次输入或输出一位(与并行端口相反)(...)术语& #34;串口"通常标识或多或少符合RS-232标准的硬件,旨在与调制解调器或与类似的通信设备连接。 (...)

来自维基百科RS-232

  

在电信领域,RS-232是串行二进制单端数据和控制信号的一系列标准的传统名称,用于连接 DTE (数据终端设备) ) DCE (数据电路终端设备)(...)

所以,DTE是你的Mac,而DCE是硬件"。要设置串行连接,您需要设置以下参数:

  • 波特率 - 可以实现的最大数据发送速度
  • 数据位 - 许多位将包含一个字符
  • 停止位 - 流同步
  • 奇偶校验 - 错误检查

E.g。某些POS外设的常见值为9600/8/1 / none,但唯一相关的是 DCE和DTE 必须 相同这些参数的值,以便按预期进行。 Mac / PC可以使用任何预定义的值,因此您需要查看硬件的手册"看看要选择什么值。

如果这两个设备中的一个具有更大的波特率设置,您将在另一侧看到垃圾数据。此外,接收的垃圾数据的大小将小于原始发送的数据大小。如果数据位未设置相同,则应该也会看到相同大小的垃圾数据。我不确定如果停止位或奇偶校验不相同会发生什么。

最重要的是 - 你需要知道你的硬件协议 - 可能是详细的 - 以使其按预期运行。一般来说,RS-232通信意味着DCE和DTE都处理一些数据,然后通过串行电缆发送一些数据(双向通信)。

然而,虽然我们现在习惯于DTE方面的multitasking在DCE方面可能不是这样 - 但是你的硬件可能是"在处理数据时无法侦听其串行端口,反之亦然。这意味着,如果您在忙于处理其他一些数据时尝试向其发送一些数据 - 它将无法接收到它。

由于RS-232比多任务处理更老 - 考虑到它们的广泛使用时间越来越长 - 正确的方法将使用RS-232 synchronization mechanisms。让我们分两个方向分解双向通信:

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

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

判断您的设置(minicomsocat)您可能正在使用某种shell管道/重定向,因此我不知道您如何阅读状态来自shell的电线(但是必须是可能的)。对于像我这样的shell / OS架构外行这是一个真正的甜蜜问题,但不幸的是我没有DCE来尝试它:(

使用类似Java simple serial connector的程序库,它就像读取布尔变量的值一样简单。

问题2:改进的串行通信(RS-232到USB)

我看到了these的两个(不同供应商),带有RS-232和USB连接器的电缆以及通常位于串行连接器侧的硬件适配器。他们没有手册,也没有任何关于他们行为的陈述,而是" serial-to-usb"短语。其中一个没有像预期的那样工作,例如虽然它是一个串行到usb"但它并没有正确地传输电线的状态。在这种情况下没什么可做的,但要找到有效的那个。

结论

一旦字节到达TCP端口,它们将被正确传输。由于socat是一个非常复杂的程序,因此您可能错误地配置了它。重复的行和字符指向的不仅仅是串行连接配置错误。但是既然你说的是硬件"对于TCP端口的工作原理,它也可能意味着来自TCP端口的数据配置错误。

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

请反馈。

答案 1 :(得分:2)

感谢您的帮助。我现在已经解决了,可以很好地沟通。 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'不会打印到控制台,而是echo在发送方传回的任何内容。奇怪的!