我正在嵌入式 ARM 平台 Slackware 上工作。我使用的是 G24 Java 调制解调器,它配置为在端口/dev/ttyS1
和之间转发数据/dev/ttyACM0
,因此进入这些端口的任何东西都可以在另一个端口上看到。我想在其中一个端口上设置终端,/dev/ttyS1
并将另一个端口转发/dev/ACM0
到 TCP 端口,以便可以通过 LAN 从其他机器访问它。
首先,我配置了/etc/inittab
:
s2:12345:respawn:/sbin/agetty -L ttyS1 115200 vt100
然后我尝试使用以下命令使用 socat:
socat -d -d -d TCP-l:2020,reuseaddr,fork /dev/ttyACM0,raw,nonblock,waitlock="/var/run/ttyACM0.lock",b115200,echo=1,icanon=1,crnl
然后我尝试从其他机器连接telnet 192.168.1.222 2020
,结果不太好,我从客户端看到终端正在要求登录,但是然后立即出现了一个我没有输入的答案:^M^M^M
......等等,终端回答登录不正确,然后一次又一次地重复同样的事情。
我知道这^M
意味着回车符,但我不太清楚如何解决这个问题。我尝试过不同的 socat 配置,但都无法正常工作。
答案1
经过几个小时的深入研究和测试许多不同的选项后,我找到了一个解决方案。
首先,我必须通过添加行来启用终端:
ttyS1
在文件中/etc/securetty
。
如果没有这个,您就无法登录到终端/dev/ttyS1
。
其次,我测试了许多不同的 socat 配置,以下命令有效:
/usr/local/bin/socat tcp-l:2020,reuseaddr,fork,crlf file:/dev/ttyACM0,echo=0,b115200,raw,crnl,icanon=1
但是,这个解决方案并不完美。终端在每个命令提示符后都会换行,因此用户输入会在下一行输入。此外,执行每个命令后都会出现一个空的命令提示符(就像我在实际输入的命令后立即输入了空命令一样)。
我想我应该/dev/ttyACM0
使用 stty 进行正确配置,但我仍在研究该主题。