# Demo-9-UVC-串口调用 **Repository Path**: my10moons/demo9uvcserial_port_call ## Basic Information - **Project Name**: Demo-9-UVC-串口调用 - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-02-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SerialPort Android 串口通信,基于[谷歌官方android-serialport-api],适用于通用的串口设备 APK下载:[下载](https://gitee.com/my10moons/demo9uvcserial_port_call/attach_files/339577/download) 功能:用户购买我司R311开发板已经内置了GD32E230单片机,demo展示了控制单片机的功能,如喂狗、重启、开锁、补光灯等。 软件展示: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0227/111013_797afa3e_5108178.png "微信图片_20200227110916.png") 1. 任意点击按钮如重启,如果出现日志E/SerialCore: Could not open tty device /dev/ttyS3,表示单片机设备不存在,请检查硬件。或者 修改串口号后再尝试,SerialCore类中修改DEFAULT_SERIAL_NUM成员变量的值即可 2. 打开串口 ```java /** * @param 1 串口路径 * @param 2 波特率 * @param 3 flags 给0就好 */ SerialPort serialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0); ``` 3. 往串口中写入数据 ```java //从串口对象中获取输出流 OutputStream outputStream = serialPort.getOutputStream(); //需要写入的数据 byte[] data = new byte[x]; data[0] = ...; data[1] = ...; data[x] = ...; //写入数据 outputStream.write(data); outputStream.flush(); ``` 4. 读取串口数据 读取数据时很可能会遇到分包的情况,即不能一次性读取正确的完整的数据 解决办法:可以在读取到数据时,让读取数据的线程sleep一段时间,等待数据全部接收完,再一次性读取出来。这样应该可以避免大部分的分包情况 ```java //从串口对象中获取输入流 InputStream inputStream = serialPort.getInputStream(); //使用循环读取数据,建议放到子线程去 while (true) { if (inputStream.available() > 0) { //当接收到数据时,sleep 500毫秒(sleep时间自己把握) Thread.sleep(500); //sleep过后,再读取数据,基本上都是完整的数据 byte[] buffer = new byte[inputStream.available()]; int size = inputStream.read(buffer); } } ``` 5. 修改设备```su```路径 打开串口时,会检测读写权限,当没有权限时,会尝试对其进行提权 ```java //默认su路径是/system/bin/su,有些设备su路径是/system/xbin/su //在new SerialPort();之前设置su路径 SerialPort.setSuPath("/system/xbin/su"); ```
>- ByteUtil类:工具类,字符串转字节数组,字节数组转字符串 >- SerialFinder类:用于查找设备下所有串口路径