相信对于学过嵌入式系统及从事相关行业的大伙来说,对于串口通信并不陌生。虽然是一种“古老”的通信手段,速度远远比不上现在的usb协议,但得益于其简单,可靠,目前仍普遍使用在对速度要求不高的单片机和宿主机之间的通信当中。现在,我们想想,是否可以再进一步,将其用在PC与PC之间、PC与服务器之间的通信呢?
答案是可以的,不然我也就不会写这篇博客了。那么,为什么要使用这老掉牙的串口通信进行ssh?或者说,相比之前介绍的DDNS、内网穿透等网络通信,其有何好处?首先,如果是外网通信,需要设备能够连接到互联网,无法应付一些极端的场景(如网络出现故障,室外无互联网,切换网络连接导致断网等),如果是内网通信,又必须要有交换机或者带有交换功能的路由器,非常麻烦,而串口通信只需一根线,就能轻松连接PC和linux设备;其次,如果是通过有线网络通信,需要占用一个网口,而大多数PC只带有1-2个网口,“寸口寸金”,有时候我们并不希望其被占用掉,而串口通信可通过板载RS232或者一个usb进行,不会占用宝贵的RJ45接口;最后,串口通信省去了许多复杂的接线和配置操作,虽说速度远比不上网络通信,但如果是作为应急情况下的备选方案,还是非常不错的。其实,即使在今天,我们也可以在许多服务器级别的主板上看到串口,可以说,简单到极致便是实用啊。
那么,如果是不带串口的普通消费级主板,该如何使用串口通信呢?很简单,买两个usb转ttl转接器就可以了,一个CH340G模块的usb转ttl也不过4块钱,也是相当便宜了。对应的驱动也是很好找的,windows这边一搜就能搜到,linux这边貌似是免驱,即插即用。
两个USB转ttl模块的连接方法也很简单,GND连GND,TXD连RXD,RXD连TXD即可。由于是两台电脑自带电源,5V/3.3V可不用连,连了之后反而可能出现电流倒流导致关不了机的情况。
连接好后,linux这边使用lsusb命令即可看到usb转ttl模块,说明成功驱动。
Bus 003 Device 002: ID 1a86:7523 QinHeng Electronics CH340 serial converter
使用以下命令查看串口设备名称,一般是ttyUSB0。
ls -l /dev/ttyUSB*
crw--w---- 1 root tty 188, 0 7月 11 13:33 /dev/ttyUSB0
编辑/etc/default/grub文件,对应位置改为如下
GRUB_CMDLINE_LINUX="console=ttyUSB0,9600 console=tty0"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"
保存后,使用以下命令更新grub.cfg(debian系统,其他可能略有不同)
sudo update-grub
设置串口为自启动,重启
sudo systemctl enable [email protected]
这样,linux这边就设置完成了,接下来只需在windows这边连接就行了,我使用的是xshell7。新建会话,在连接中选择串口,按如下配置即可。
连接后,输入用户名和密码,即可和其它ssh一样操作了。
教程到此就结束了,怎么样,是不是非常简单?不过目前还有一个个人无法解决的问题,那就是虽然ch340芯片支持到115200的波特率,但linux中serial-getty服务默认保持最小9600的波特率,这就导致本就很慢的串口传输变得更慢了,慢到什么程度呢?且不说传输文件,单是打印文本时都是肉眼可见的一行一行输出的,仿佛几十年前的老式针式打印机,也难怪要把用户终端叫做tty(电传打字机),输出文字不叫“显示”而叫“打印”,不过好在虽然带宽小,延迟却不大,输入命令时还是非常流畅的。
taffy@debian:~$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 24; columns 80; line = 0;
有个临时的解决办法就是使用stty命令更改串口波特率,115200波特率下,速度快了不少,虽然和网络通信相比还是差了点意思,但起码感官上舒服了不少。当然,这样更改只能是临时的,重启后又回到9600了,想要长久使用的话可以设置开机自动执行命令。我就懒得改了,反正串口通信基本上是候补方案,一般我也不会用到,9600波特率也无伤大雅。
另提一嘴,USB转ttl控制服务器无法像DELL的iDRAC,HP的iLo5那样做到bios级别的控制,只能在网络崩了的情况使用,如果是系统甚至是bios出了问题,那就无能为力咯。
膜拜喵
卧槽大佬! 是串口!