目录
1. 引言
R232目前在工业界应用还是比较广泛,当我们手头没有串口的硬件设备但是又希望调试一些串口程序时就应用到了这篇博客将要介绍的内容:虚拟串口。说白了就是通过软件模拟一对串口。这样对于用户程序来说可以像访问真实的串口设备一样来访问虚拟串口。
2. 虚拟串口的实现
2.1 安装socat
在Linux下无需自己完成虚拟串口的创建工作,socat可以帮助我们很好的完成这件事情。安装socat的步骤如下:
sudo apt-get install socat
2.2 生成虚拟串口对
打开终端通过如下指令生成虚拟串口对:
socat -d -d pty,b115200 pty,b115200
指令输出结果如下所示:
2021/04/26 17:01:27 socat[116890] N PTY is /dev/pts/7
2021/04/26 17:01:27 socat[116890] N PTY is /dev/pts/8
2021/04/26 17:01:27 socat[116890] N starting data transfer loop with FDs [5,5] and [7,7]
在这个示例中/dev/pts/7和/dev/pts/8就是生成的虚拟串口对。注意不同的机器生成的串口设备的编号可能不一样,比如有的机器上可能会生成/dev/pts/0和/dev/pts/1等。之后我们可以像访问真实的串口设备一样访问这两个虚拟串口了。
3. 虚拟串口的python访问
3.1 读串口
读/dev/pts/8串口的代码如下所示:
#!/usr/bin/env python
#coding=utf8
import serial
from time import sleep
def recv(serial):
while True:
data = serial.read_all()
if data == '':
continue;
else:
break;
sleep(0.02)
return data
if __name__=="__main__":
serial = serial.Serial("/dev/pts/8", 115200, timeout=0.5)
if serial.isOpen():
print("open success")
else:
print("open failed")
while True:
data = recv(serial)
if data != b'':
print("receive:", data)
serial.write(data)
这段代码是从/dev/pts/8串口设备读数据并将读到的数据再反馈给发送端。
3.2 写串口
写/dev/pts/7串口的代码如下所示:
#!/usr/bin/env python
#coding=utf8
import serial
from time import sleep
if __name__=="__main__":
serial = serial.Serial("/dev/pts/7", 115200, timeout=0.5)
if serial.isOpen():
print("open success")
else:
print("open failed")
while True:
serial.write("test")
print("send: test")
sleep(1)
这段代码向/dev/pts/7不断地发送数据。
4. 虚拟串口的C++访问
其实我们完全可以将虚拟串口当作真实的串口来使用,网上关于串口编程的例子非常多,具体可以参考linux下串口编程。
5. 后记
其实实现虚拟串口并不复杂,但是作者在最开始实现这个功能的时候掉到了cutecom调试助手的坑里面。cutecom本身是一个串口调试助手,但是我发现它无法识别任何socat创建的串口设备,这个软件打开之后只有默认的/dev/ttyS0可以打开,其他的都不可用而且不能手动编辑Device,这导致在虚拟串口上花费了很多的时间,因此在这里记录一下这个问题。