参考文章: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
前段时间,接触了一个智能硬件的项目,在定制化的平板上运行 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 上的串口调试工具不清楚
连接
-
用 串口线 连接开发板 和 PC,然后在串口调试工具中,打开对应位置的端口。如果提示失败,就要检查串口线的端口号是否正确。
-
用数据线连接开发板至 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 串口调试工具,方便调试。
apk 下载
源码地址:AndroidSerialPort
来源:oschina
链接:https://my.oschina.net/u/1177694/blog/4302807