将流量从端口 ttyS3 转发到 ttyUSB0 - 输入/输出错误



我正在尝试设置一个基本管道,将所有写入ttyS3的数据传输到ttyUSB0。我找到了一些解决此类问题的方法,但它们似乎没有多大帮助。问题似乎是,每当我使用 ttyS3 做任何事情时,我都会得到这个:

stty: /dev/ttyS3: Input/output error

ls -l /dev/ttyS*和同样的事情/dev/ttyUSB*我得到以下结果:

root@arm-64:~# ls -l /dev/ttyS*
crw-rw---- 1 root dialout 4, 64 Feb  9 13:08 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 Feb  9 13:08 /dev/ttyS1
crw--w---- 1 root tty     4, 66 Feb  9 13:08 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 Feb  9 13:08 /dev/ttyS3
crw-rw---- 1 root dialout 4, 68 Feb  9 13:08 /dev/ttyS4
root@arm-64:~# ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Feb  9 13:08 /dev/ttyUSB0

我创建了以下脚本来在启动时为我完成这项工作。在某处阅读后,我更改了主要/次要值以匹配USB0的值,这可以用作管道。虽然它确实在没有抛出Input/output error的情况下执行,但它似乎没有按预期工作。

#!/bin/bash
rm /dev/ttyS3
mknod -m 666 /dev/ttyS3 c 188 0
chown root.dialout /dev/ttyS3
chmod 666 /dev/ttyS3
stty -F /dev/ttyUSB0 speed 115200 cs8
stty -F /dev/ttyS3 speed 115200 cs8
cat /dev/ttyS3 > /dev/ttyUSB0 &

我只需要创建一个基本的管道,它将获取写入ttyS3的所有数据并将其传递给ttyUSB0。虽然我认为这无关紧要,但我正在电视盒(Tx3 Mini)上运行Armbian靶心

我只需要创建一个基本的管道,它将所有写入ttyS3的数据传递给ttyUSB0

只要每个串行终端都正确设置且功能/可操作,就不会看到问题。 在创建"管道"之前,您是否验证了每个串行终端是否正常运行?

在 SBC 上,我将控制台放在串行终端上,并使用 SoC USART 和 USB 适配器建立了另外两个串行终端:

# ls -l /dev/tty*S*                                      
crw-rw---- 1 root dialout 246,  0 Jan  1  2012 /dev/ttyGS0                      
crw------- 1 root tty       4, 64 Jul 31 22:46 /dev/ttyS0                       
crw-rw---- 1 root dialout   4, 65 Jul 31 22:25 /dev/ttyS1                       
crw-rw---- 1 root dialout 188,  0 Jul 31 22:28 /dev/ttyUSB0                     
#

请注意,udev守护进程创建了这些设备节点,并且不需要有趣的业务(即手动重新创建设备节点)来完成"管道"。

为了删除规范处理,每个串行终端都处于原始模式并具有匹配的波特率:

# stty raw 115200 -F /dev/ttyUSB0
# stty raw 115200 -F /dev/ttyS1

所有术语设置的报告:

# stty -aF /dev/ttyUSB0                                  
speed 115200 baud; rows 0; columns 0; line = 0;                                 
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;           
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;  
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;                       
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts                 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8                                                   
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt   
echoctl echoke -flusho -extproc                                                 
#
# stty -aF /dev/ttyS1                                    
speed 115200 baud; rows 0; columns 0; line = 0;                                 
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;           
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;  
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;                       
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts                 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8                                                   
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt   
echoctl echoke -flusho -extproc                                                 
#

然后当命令

# cat /dev/ttyS1 > /dev/ttyUSB0 &

发出,在连接到/dev/ttyS1 的远程终端模拟器程序上键入的任何内容都会显示在连接到/dev/ttyUSB0.<</strong>br/> 的远程终端模拟器程序上,这似乎表现得像所需的"将所有数据写入 ttyS 的基本管道?并将其传递给 ttyUSB0"。

底线:
无法重复问题,并且可以创建两个串行链路的"管道"。

# uname -a                                               
Linux sama5d2-xplained 5.4.81-linux4sam-2020.10 #1 Thu Jan 14 12:54:56 UTC 2021 
armv7l armv7l armv7l GNU/Linux                                                  
#

问题似乎是,每当我使用 ttyS3 做任何事情时,我都会得到这个:

stty: /dev/ttyS3: Input/output error

......我在电视盒上运行 Armbian 靶心 (Tx3 Mini)

如前所述,您需要验证每个串行终端是否正常运行.
由于"电视盒">实际上并不需要五个(!)串行终端,因此您可能会看到/创建没有任何硬件可以访问的虚假设备节点。
在系统日志中搜索已初始化的实际硬件,例如'dmesg | grep tty'。 其中一个UART可用于与IR接收器接口。

最新更新