PC和Android模拟器之间虚拟串口通信

前言

很多时候我们在做串口通信的时候需要去模拟串口来调试,这样可以极大的方便我们的工作,不然的话可能需要连接硬件设备,比较麻烦。一般情况下我们先在电脑上模拟串口后初步调试,最后阶段在硬件设备上实际调试。

工具介绍

Virtual Serial Port Driver

Virtual Serial Port Driver

该软件提供虚拟串行端口的仿真,并通过虚拟零调制解调器电缆对可用的串行端口进行配对。与此软件配对的两个应用程序可以交换数据。每个端口上的每个数据都显示在计算机的设备管理器中以便查看,同时COM端口模拟其预期设置和运行进程。用户可以创建虚拟端口,而不必担心串行端口不足和物理硬件拥挤。该软件的下一个优势是能够与ActiveX、DDL和核心级实用程序等技术集成。

官网地址:https://www.virtual-serial-port.org/

Oracle VM VirtualBox

Oracle VM VirtualBox

virtualbox是一款功能强大的x86和AMD64/intel64虚拟化产品,可供企业和家庭使用。virtualbox不仅是为企业客户提供的功能极其丰富、高性能的产品,而且是根据GNU通用公共许可证(GPL)版本2的条款免费作为开源软件提供的唯一专业解决方案。

目前,virtualbox运行在Windows、Linux、Macintosh和Solaris主机上,支持大量的其他操作系统,包括但不限于Windows(NT 4.0、2000、XP、Server 2003、Vista、Windows 7、Windows 8、Windows 10)、DOS/Windows 3.x、Linux(2.4、2.6、3.x和4.x)、Solaris和OpenSolaris、OS/2和OpenBSD。

利用 Oracle VM VirtualBox 我们可以虚拟你一个linux系统并创建一个串口,用来在模拟器中虚拟串口(因为Android的串口是基于linux的)。

官网地址:https://www.virtualbox.org/

串口调试助手

串口调试助手有很多,在 Google 或者 Baidu 搜索均可找到,下面列出几种常见的串口调试助手:

友善串口调试助手(v2.6.5)

优点:

  • 使用方便,不丢包;
  • 串口自动识别,支持COM9以上串口;
  • 支持多串口调试;
  • 支持历史发送记录;
  • 广泛支持各种波特率,高达10 Mbps以上波特率,具体和电脑硬件有关。

缺点:会丢失数据,刷屏显示不流畅,不适合稳定性测试。

串口调试助手(V2.2)

优点:使用方便,用户群最多,有书介绍及免费源代码。

缺点:

  • 因采用多线程接收技术,接收有时丢数,特别在高波特率或使用USB转串口时丢数较多。
  • 最大只支持115.2K波特率。
  • 只能选COM1~COM2,使用USB转串口时,要重新映射串口。

SSCOM3.2

优点:支持自动识别已连接串口设备,使用方便,接收不丢数。 稳定性效果好。界面简洁,用户体验很好。

缺点:连接状态插拔串口程序会崩溃,导致电脑蓝屏。高波特率只有115.2K、128K、256K,没有230.4K。作为控制台,不支持回显。win10下不支持保存显示数据。

PCOMAPR1.5(pcomtest)

优点:波特率高,最高达921.6K,接收不丢数。

缺点:只有COM1~COM4可选,使用USB转串口时,要重新映射串口。

Accesport1.33

优点:功能强,配置参数多,接收不丢数。

缺点:波特率较高时(如230.4K),如果接收数据量大(比量接收),则无法发送数据。

通信过程

先通过 Virtual Serial Port Driver 创建两个虚拟端口COM2和COM3,当然你也可以创建成COM4和COM5,这个没有什么影响,如下图:

创建虚拟端口COM2和COM3

然后打开 Oracle VM VirtualBox 创建一个虚拟机,选择Linux系统,内存选个1GB或2GB看情况而定,硬盘就默认8G就ok了。

创建虚拟机

创建成功后点击设置按钮,然后找到串口项,设置端口1

设置串口端口1

其中端口编号COM1对应的是android虚拟机中的 /dev/ttyS0 , 地址(p)项的COM2口则对应的是上面我们虚拟的COM2端口,当然你也可以设置为COM3,因为我们前面创建了两个虚拟端口。

接下来我们启动Android模拟器,我使用的是 Genymotion,这里要注意的是我们创建的模拟器要低于Android 4.4版本,不然模拟器不支持虚拟串口。

创建模拟器并启动

启动模拟器后再打开串口调试助手,让串口调试助手连接另一个端口(模拟器用的COM2,所以这里连接COM3),设置完点击打开串口。

设置并打开串口调试助手

这个时候你就会发现 Virtual Serial Port Driver 中的两个虚拟串口状态都为活动状态,如下图:

虚拟串口端口活动状态

最后我们在apk中打开串口 /dev/ttyS0 发送模拟数据,可以在串口调试助手中看到收到数据,注意这里两边需要设置相同的波特率。

mSerialPort = new SerialPort("/dev/ttyS0", "9600", 0);
mInputStream = new BufferedInputStream(mSerialPort.getInputStream());
mOutputStream = new BufferedOutputStream(mSerialPort.getOutputStream());
mReadThread = new SerialReadThread();
mReadThread.start();

虚拟串口收发数据