有时候我们需要从网络上的某台电脑访问网络中的一台嵌入式设备的串口调试底层代码,而这台嵌入式设备的串口接在网络中另一台电脑的串口上,比如我现在需要调试的硬件环境如下:
Win11系统的串口上连接这一个开发板的串口,
Win11系统中使用Vitualbox软件安装着一台Ubuntu 22.04的虚拟机,
需要在Ubuntu22.04中访问开发板的串口,以便调试用。
Virtualbox提供了多种方法可以在guest主机中虚拟一个串口从而与host主机的串口进行通讯,我试过两种方法,一是“主机设备”的端口模式,二是“TCP”的端口模式。两种模式都能够成功访问host主机的串口,但都有一个同样的问题:
host主机待机会导致guest主机中的串口设备无法找到(NOT_FOUND的错误),如果需要重新找到串口设备,就需要将guest主机休眠再恢复,比较浪费时间,而且并不是每次重新恢复guest主机后都能成功找到串口设备,会概率性失败,具体原因还不清楚。
此时采用网络访问开发板的串口就比较灵活了,因为当host主机待机并且恢复后,guest主机不需要休眠再唤醒,只需要重新建立网络连接就可以了。
可以采用相应的方法(硬件或者软件)实现这一功能。
本文提供一种有效且免费的方法(当然你也可以购买商业版的许可证,支持一下自主研发,;-))。这一方法使用的是如下两个软件工具:
1. CommFront公司的Serial-TCP工具,运行在Windows系统下;
2. socat命令,运行在Linux系统下。
第一步:
在host主机的Windows系统下,运行Serial-TCP工具(工具下载地址:Free Serial-TCP (More than just a Device Server) – CommFront,应该也有其他的工具的,如果host主机是Linux系统,应该只需要采用socat命令实现这一工具的功能(我还没有试过,待验证)),根据开发板的串口配置如下设置好相应的参数,电机activate按钮,启动串口和TCP端口的连接,这样host主机串口的数据就通过设置的TCP连接同步进行收发了:
第二步:
在guest主机的Ubuntu 22.04系统下,在其中一个窗口中输入如下命令:
socat TCP-CONNECT:192.168.1.100:1234 PTY,link=/tmp/foo-pty
再在另一个窗口中输入如下命令,就可以访问开发板的串口了:
screen /tmp/foo-pty
效果如下:
参考网站: