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

Macos 使用socat的Mac上的USB串行端口,macos,serial-port,usb,tty,socat,Macos,Serial Port,Usb,Tty,Socat,我有一块硬件,它通过一根多产的串行到USB电缆连接,我需要使用socat来发送/接收与此和TCP端口之间的通信量。到目前为止,它已安装并可与minicom配合使用: minicom-D/dev/tty.usbserial-b9600 Socat在TCP端口的一个方向上工作,使用: socat/dev/tty.usbserial,clocal=1,nonblock=1,cread=1,cs8,ixon=1,ixoff=1 TCP4:localhost:8080 我如何让它双向工作?我经常看到重复的

我有一块硬件,它通过一根多产的串行到USB电缆连接,我需要使用socat来发送/接收与此和TCP端口之间的通信量。到目前为止,它已安装并可与minicom配合使用:

minicom-D/dev/tty.usbserial-b9600

Socat在TCP端口的一个方向上工作,使用:

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

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

谢谢!克里斯

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


我很可能会告诉你很多你已经知道的东西,但是调试这些情况通常会得到一个完整的画面。

问题1:经典串行通信(纯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端,但DCE端可能不适用这种情况,但您的“硬件”在处理数据时可能无法监听其串行端口,反之亦然。也就是说,如果您试图在它忙于处理其他数据时向它发送一些数据,它将无法接收

由于RS-232比多任务处理更古老——考虑到其广泛使用的时间,它的历史要长得多——正确的方法是使用RS-232。让我们将双向通信分解为两个方向:

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

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

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

像这样使用程序库就变得和读取布尔变量的值一样简单

问题2:自适应串行通信(RS-232到USB) 我看到两个(不同的供应商)的电缆,带有RS-232和USB连接器以及一个硬件适配器,通常在串行连接器端。它们没有手册,也没有任何关于其行为的说明,只有“串行到USB”短语。其中一个没有按预期工作,例如,它没有正确转换导线的状态,尽管它是一个“串行到usb”。在这种情况下不需要做太多的工作,但要确保工作正常

结论 一旦字节到达TCP端口,它们将被正确地转换。由于socat是一个非常复杂的程序,您可能对其进行了错误配置。重复的行和字符表明这不仅仅是串行连接错误配置。但是,由于您声明“一块硬件“要使TCP端口正常工作,还可能意味着来自TCP端口的数据配置错误

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


请反馈。

谢谢您的帮助。我现在
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]
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