Android模拟器挂载虚拟串口进行通信之踩坑记

混江龙づ霸主 提交于 2020-08-13 08:31:08

参考文章:https://blog.csdn.net/WarweeSZip/article/details/72956218

0 前言
最近刚接触串口通信,在学习Android串口编程,然后在一篇博客中看到可以在模拟器上挂载串口进行通信,嗯?还有这种操作,好6啊!鉴于设备还未到位,于是就动手撸起来,测试下写的串口通信的代码,于是就有了这篇踩坑记,以便以后忘记了能查阅,如果能给其他小伙伴带来一点帮助那是再好不过了。虽然很多原理还没搞懂,但好歹在踩了各种坑之后终于能够成功通信了。

还是菜鸟一枚,很多原理不懂,因此有些言论可能不准确,所以仅供参考,若有错误望指出,谢谢啦~

1 准备
依照上篇博客的指引,需要准备以下工具:

1)虚拟串口工具
下载虚拟串口工具,可以下载参考文章中提供的链接,也可以直接百度搜索下载
安装并运行工具,并添加一对串口


2)串口调试工具
下载串口调试工具,百度一搜一大把,我使用的是这个:https://www.ttrar.com/html/158809.html
直接运行exe就可以打开窗口,分别打开两个窗口去打开串口,测试两个串口之间的通信


2 动手
这个流程是本人亲测有效的,但不排除在其他人手里会出现问题。就像我最开始也是照着他人的博客撸的,但人家就是成功的到我这儿就不行了,我也很绝望的ε=(´ο`*)))

1)准备模拟器
准备Android 4.4版本的模拟器,下载的是x86且不带Google APIs的system image


2)挂载串口
如果要挂载的模拟器和串口是打开的,则需要关闭才能挂载成功
打开cmd,进入AndroidSDK的目录下的tools目录,执行以下命令

emulator -avd Pixel_3a_XL_API_19 -writable-system -qemu -serial COM1
1
将其中的模拟器和串口的名称替换为自己的就好了,我这里是将COM1挂载到Pixel_3a_XL_API_19的模拟器上
没问题的情况下就能启动模拟器了,端口设置保持默认的就好了,点击确定就OK了


3)运行Demo
从https://github.com/kongqw/AndroidSerialPort下载一个别人写好的项目,运行起来,查看效果。

检测出4个地址,发现只有ttyS0和ttyS1能打开,ttyS1能和COM2成功通信,ttyS0不行。看网上的说法,貌似都不一样,不知道原理是啥(•_•)?


3 踩坑
看步骤貌似挺简单的,但由于在下知识匮乏,实施起来各种坑ε=(´ο`*)))

1)报错:‘emulator’ 不是内部或外部命令
如果没有配置环境变量,会报:‘emulator’ 不是内部或外部命令 的错误。可以去配置,也可以进入安装的AndroidSDK下的tools目录下执行命令。

2)使用Android Studio自带的模拟器,第三方模拟器暂时不知道怎么使用
3)模拟器的名称
模拟器的名称的查看有两种方式:
a) 查看目录
我这边的目录是C:\Users\Shirley\.android\avd,一般应该都能在C盘的用户目录下找到.android文件夹

b) cmd命令
输入以下指令也能查看模拟器列表

emulator -list-avds
1

3)报错:Missing emulator engine program for ‘x86’ CPU

参考博客的指引,重新下载不带Google APIs的x86 Images, 然后再重启终端,重新输入命令

4)报错:Failed CreateFile (5)

# ̄~ ̄#网上资料找找找,据悉返回5表示串口被占据了,需要关闭串口才能成功
注意,串口和模拟器都必须要关闭

5)关于模拟器的版本和Root的问题
最开始是使用Android 10.0 模拟器,连接上了但运行测试程序时结果还是失败。网上说模拟器要Root才行ε=(´ο`*)))

然后开始给模拟器获取Root权限。找了个教程,教程是使用Android 8.0的,于是捣鼓了半天,结果终于在Android 8.0 的模拟器上Root成功,运行Demo时有四个串口地址,只有ttyS0可以打开,但是却不能通信。咋回事儿ε=(´ο`*)))

后来想到是不是Android版本的问题,于是又试了Android 7.0 的,还是不行

各种想想想,各种找找找,最后看到一篇博客中使用Android 4.4,然后就试了下Android 4.4 版本的模拟器,结果一试就成功了,哈哈哈。还发现原来4.4的模拟机是root过了的,直接挂载串口就行了。

4 总结
其实还有很多不懂的,比如说串口挂载的原理,怎么Android 4.4 的模拟器默认就是Root了呢,怎么其他版本的模拟器Root过了也还是不能通信呢,怎么有四个地址呢,怎么版本8.0的可以打开ttyS0但却不能通信呢,ttyS1可以和COM2通信说明ttyS1才是映射到COM1的吗,ε=(´ο`*)))

好多问题,虽然成功通信了还是一头雾水呀。。。ε=(´ο`*)))唉先这样吧

adb shell 调试 Android 串口

caz28 2013-01-22 13:02:15  23370  收藏 1
展开
Android手机上很多外设是串口连接到AP的,如modem,gps。为了调试这些串口,通常需要将它们飞线接出来,用pc的串口连接调试。这样比较麻烦。

在adb  shell里是可以直接调试串口的,就不用飞线了,还可以验证Android串口配置是否正确。

用usb连接Android设备调试后,在pc端输入 adb shell,连接成功后,先停止一些可能占用端口的服务,如:

stop ril-daemon停掉ril后台

然后:

busybox microcom -t 15000 -s 115200 /dev/ttyS0

-t 单位毫秒,无操作自动退出时间。

-s 单位bps,串口波特率。

ttyS0 要操作的串口。

然后打开另一个命令行窗口,输入:

adb shell cat /dev/ttyS0

然后可以在第一个窗口输入命令,在第二个窗口可以看到命令和响应。

如果没有响应,请检查Android串口配置是否正确,串口号是否对,波特率是否正确。

microcom的-t设置要合理,太短,输入命令可能输入不完就退出了,太长要等很久才退出。

必须先执行第一个窗口,再执行第二个窗口,因为不设置波特率,第二个窗口显示会有问题。

第一个窗口microcom退出后,也可以用以下方法发送命令到串口:

echo -e "AT\r\n">/dev/ttyS0

annie-spratt-648653-unsplash_meitu_1

前段时间,接触了一个智能硬件的项目,在定制化的平板上运行 Android 系统,并通过串口和蓝牙与其他设备进行通讯。
担心时间长了,就容易忘记,因此,整理了关于 Android 串口通信的知识。

什么是串口通信

先来一段 百度百科的解释

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

串口通信(Serial Communications)是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。

串口通信是计算机中非常常见的通信方式,比如一些有线鼠标、键盘、打印机等都是通过串口进行通信的。

串口的通信一般使用3根线完成,分别是地线、发送线(tx)、接收线(rx)。

 

串口的参数

串口中有五个重要的参数:串口设备名、波特率、奇偶校验位、数据位、停止位。

  • 设备名称:串口的名称。
  • 波特率:传输速率的参数,波特率和传输距离成反比。
  • 校验位:在串口通信中一种简单的检错方式,有四种检错方式:偶、奇、高和低,允许无校验位。
  • 数据位:通信中实际数据位的参数
  • 停止位:用于表示单个包的最后一位。

其中检验位一般默认位NONE,数据位一般默认为8,停止位默认为1,校验位是为了减少误差的会根据奇、偶进行补位操作。

对于两个进行通信的端口,这些参数必须匹配,否则两端不能正常收发。

 

Android 串口通信

Android 主板在与其它硬件进行串口通信时,串口作为底层实现,Android 系统把设备作为一个文件,与其他设备进行串口通信就相当于读写此文件。

所以,串口通信其实就是对系统根目录下 /proc/tty/drivers 文件进行流的读写,因此,串口读写需要 Android 系统 Root 权限,不必担心,一般开发版的系统都会 Root 。

 

在应用层进行串口通信之前,千万要检测开发板的串口是否调通,不要背锅哦~(不要问我为什么知道这坑)

检测的方式可以选择 adb 或者直接下载 Android 调试工具,进行调试,推荐使用工具,简单方便。

那么先说说 adb 方式的检测。

检测

检测的原理就是,将 开发板串口线 连接上 电脑 (PC),然后在 PC 和开发板 上,相互进行串口数据的读写。如果两边都能顺利收发数据,那么说明开发板的串口是畅通的。

准备

Windows:友善串口调试工具

Mac OS 上的串口调试工具不清楚

连接

  1. 串口线 连接开发板 和 PC,然后在串口调试工具中,打开对应位置的端口。如果提示失败,就要检查串口线的端口号是否正确。

  2. 用数据线连接开发板至 PC,用 adb 命令打开 Android 系统对应的串口文件。

    以 root 权限进入系统,

    adb shell
    su
    

    然后,更改串口文件ttyS3的读写权限,

    chmod 777 /dev/ttyS3
    

    最后,写入信息 1111 到串口文件ttyS3

    echo 1111 > /dev/ttyS3
    

    观察 PC 上的串口调试工具,如果 PC 上能收到信息,说明调通了,那么就可以进行应用开发了。

 

官方串口工具

Android 应用层如果操作串口,需要用到 JNI ,谷歌官方早已经开源了相关工具库:android-serialport-api

官方地址需要翻墙,也可以直接搜索这个工具,下载体验 Dmo。

谷歌官方的这个库太过陈旧,使用也麻烦,而且谷歌官方串口库的设置,仅支持串口名称及波特率,有时候并不能够满足需求。

基于以上原因,因此利用Android studio 3.1上 CMake,将官方串口库移植过来 ,并对其进行适当扩展,现支持如下配置:

  • su 路径
  • 串口路径
  • 波特率
  • 校验位
  • 数据位
  • 停止位。

为了方便使用,此库已经发布到 JCenter 上,以后可以非常容易的集成它。

同时,使用这个库做了一个Android 串口调试工具,方便调试。

 
SerialPort

apk 下载
源码地址:AndroidSerialPort

 


 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!