安卓串口通讯(模拟机测试)

安卓串口通讯
Android studio模拟机模拟测试串口通讯,踩坑记录

Android 串口

需求安卓通过串口与硬件设备通讯交互

开源的 android_serialport_api

需要

  • Android studio 模拟机
    • 不要下带Play Store(谷歌商店) ,会获取不到root权限的
  • 虚拟串口设备工具
    • 下载安装后,虚拟对 串口 COM1-COM2 (其他的也行,本文用COM1-COM2为例)
    • 本文使用Virtual Serial Port Driver Pro 9.0
  • 串口调试工具
    • 网上随便找个,能测试收发就行
    • 本文使用 Serial Port Utility

步骤零

  • 串口调试工具

    • 启动打开 COM1口,波特率 9600 (两端一致就行)
  • 模拟机

    • 安装完后,打开命令提示符cmd

    • 进入你 Android studiosdk 所安装的位置 ,里面的 tools

      • 例如 D:\Android\Sdk\tools
    • 执行

      1
      emulator.exe @api -qemu -serial COM2
      • COM2 是要映射的端口

      • api 是我的模拟器 名字

        • 不知道的可用下列命令查看

          1
          emulator.exe -list-avds
    • 执行成功后,会让你选配置,同串口工具一致即可

    • 模拟器开机后,需设置串口权限

      • 进入 D:\Android\Sdk\platform-tools

      • 执行

        1
        2
        3
        4
        5
        6
        7
        8
              # 进入 Android 内部
        adb.exe shell
        # 切换至 管理员权限
        su
        # 打开 串口 所有权限
        chmod 777 /dev/ttyS1
        # 关闭校验
        setenforce 0
  • 以上两端联通

    大致对应表

    ttyS0 — COM1

    ttyS1 — COM2

    注意:

    模拟器的 COM1 口 好像被占用了

步骤一

copy android_serialport_api的文件

  • jni目录(文件夹以及里面全部内容)

  • jniLibs目录(文件夹以及里面全部内容)

  • android_serialport_api目录(文件夹以及里面全部内容)

步骤二

  • jnijniLibs 移动至自己项目里的app>src>main
  • android_serialport_api 放到 java
  • 移动完成后,用studio 预览下看是否添加成功

步骤三

现在开始使用

  • /dev/ttyS1 对应 COM2 (模拟器上的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//引入库
import android_serialport_api.SerialPort;
/*
*
* 省略不重要代码
*
*/
private void serialport (){
//打开串口 ttyS1
SerialPort mSerialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0);
// 输出流
OutputStream mOutputStream = mSerialPort.getOutputStream();
// 输入流
InputStream mInputStream = mSerialPort.getInputStream();

//发送信息
byte[] send_msg = new byte[1];
send_msg[0] = new String("100").byteValue();
mOutputStream.write(send_msg);
mOutputStream.flush();

//接收信息
byte[] get_msg = new byte[1];
int size = mInputStream.read(get_msg);
String msg = Integer.valueOf(get_msg[0]).toString();
}