使用socat进行原始串行连接

时间:2014-10-15 01:25:38

标签: linux bash serial-port socat

目标是使用embedded界面连接到serial设备。 到目前为止,我已经使用过:

stty -F /dev/ttyS2 115200 cs8 ixoff
socat readline,history=/etc/socat.history /dev/ttyS2,raw,echo=0

它的效果很好,但之后我发现在system boot期间有一些选项需要您按下一个键而不按enterreadline在那里失败。所以我的想法是将ttyS2绑定到cons0,但后来我发现了多个问题,例如无法退出(ctr+cctr+q ctr+]甚至esc不起作用),backspacedelete不起作用,字母输入两次,等等。经过一些试验和错误后,我想出了这个:

socat /dev/cons0,raw,echo=0,crnl /dev/ttyS2,raw,echo=0,escape=0x03,crnl
    双方的
  • raw允许单个key press触发boot option
  • 双方的
  • echo=0会阻止key press加倍
  • 双方的
  • crnl会阻止enter key press加倍
  • escape=0x03允许我按quit
  • ctr+c

问题是,当我退出时,我的cons0全部都是f **** d,好像它以某种方式保留了raw,echo=0,crnl设置。我知道这个问题可能对我的场景来说太具体了,但我只需要一种简单的方法来将键击发送到串行,就像我使用putty(我的平台上不可用)一样。我正在使用socat,因为它非常轻量级,不需要任何附加库,并且因为显示的命令是使用expect的更大脚本的一部分。

非常感谢任何想法和建议。

2 个答案:

答案 0 :(得分:2)

正如Austin Phillips所说,你可以使用stty sane来恢复......

...但更好的是,您可以(可能)将其作为socat xxxxx ; stty sane附加到您的socat命令,并在使用ctrl-c退出时自动恢复

答案 1 :(得分:0)

谢谢,这对我有用! 我只想指出脚本不应该依赖于"静态"控制台识别,因为当expect生成脚本时,它将具有完全不同的tty,因此:

socat $(tty),raw,echo=0,escape=0x03 /dev/ttyS2,raw,echo=0,nonblock ; stty sane

编辑:nonblock也解决了"输入"问题