【问题标题】:USB Serial Port on Mac using socatMac 上使用 socat 的 USB 串行端口
【发布时间】:2013-01-09 13:00:29
【问题描述】:

我有一块硬件通过 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]

【问题讨论】:

    标签: macos serial-port usb tty socat


    【解决方案1】:

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

    【讨论】:

    • ispeed=9600,ospeed=9600b9600 有什么区别?我还在生成的设备上运行stty --file,它报告速度为0。有多奇怪?
    【解决方案2】:

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

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

    来自serial port 的维基百科:

    在计算中,串行端口是一种串行通信物理接口,信息通过它一次一位地传入或传出(与并行端口相反)(...)术语“ serial port”通常表示硬件或多或少符合 RS-232 标准,旨在与调制解调器接口或类似的通信设备。 (...)

    来自RS-232 的维基百科:

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

    因此,DTE 是您的 Mac,而 DCE 是“硬件”。要设置串行连接,您需要设置以下参数:

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

    例如一些 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(硬件部分):DTE 激活 RTS(请求发送)线,并等待直到 DCE 激活 CTS(清除发送)线。然后它发送数据。

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

    判断您的设置(minicomsocat)您可能正在使用某种外壳管道/重定向,所以我不知道您如何从外壳读取电线的状态(虽然,它必须是可能的)。对于像我这样的 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 端口的数据。我希望你有一本关于你的“硬件”的手册:)

    请反馈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多