前一篇文章提到我们的外接设备里有打印机,一开始是直接用usb连接到Android主板上,然后进行通讯发送打印指令,但是经常打印命令发一半就莫名其妙的停掉。后来,我加了usb插入和拔出的监听,发现原因就是usb被拔出了。到了这一步的时候,发现usb的可靠性真的不太好,所以决定改用232串口进行通讯。所以建议各位同志们,能用串口的就用串口吧!
232串口,一般主板上都是3针的插口,正规的主板上会有标注232-1、232-2之类的。对应到系统里就是ttyS1、ttyS2。然后3根针脚是对应发送、接收和接地线,发送和接受2个针脚是最容易搞混的,第一次的时候就是因为这2根线接反了一直没数据。
总结下串口通讯异常的排查步骤:
1、进行自发自收的测试。
使用金属线短接收发2根线。然后使用串口调试工具(下面的附件),设置好串口、波特率、停止位等选项、然后打开串口;再在发送区输入“123”,方便起见可勾选自动发送,然后观察接收区有没有能接受到“123”。
2、设备的测试。
第一步能正常收发的话,则说明主板一端的串口是正常的,然后就可以确定问题出在设备一侧。对于设备我们可以使用usb转232的数据线连接设备进行调试。usb转232的数据线一般都需要安装驱动才能使用,各位可以观察接头上的品牌,下载对应的驱动。
废话码了一堆之后,说说串口通讯的实现。串口通讯必不可少的一个东西就是SerialPort.so。这里面有一个坑就是so文件里有个包名,对于和SerialPort.java文件的包名对于上,否则会app会因为找不到so文件闪退。
贴上我抽取出来的SerialPort相关内容。
package com.nativec.tools;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class SerialPort {
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
static {
System.loadLibrary("serial_port");
}
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {
if (!device.canRead() || !device.canWrite()) {
try {
Process su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
su.getOutputStream().write(cmd.getBytes());
if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) {
throw new SecurityException();
}
} catch (Exception var6) {
var6.printStackTrace();
throw new SecurityException();
}
}
this.mFd = open(device.getAbsolutePath(), baudrate, flags);
if (this.mFd == null) {
throw new IOException();
} else {
this.mFileInputStream = new FileInputStream(this.mFd);
this.mFileOutputStream = new FileOutputStream(this.mFd);
}
}
public InputStream getInputStream() {
return this.mFileInputStream;
}
public OutputStream getOutputStream() {
return this.mFileOutputStream;
}
private static native FileDescriptor open(String var0, int var1, int var2);
public native void close();
public int write(final byte[] srcData) {
if (this.mFileOutputStream == null) {
return -3;
}
try {
this.mFileOutputStream.write(srcData);
this.mFileOutputStream.flush();
}catch (Exception e) {
return -1;
}
return srcData.length;
}
}
打开串口:
SerialPort sp = new SerialPort(new File(“ttyS1”), 9600,0);
sp.open();
发送数据
sp.write(new byte[]{11,10,10});
子线程循环接收串口发回的数据
new Thread(() -> {
while (true){
//
}
}).start();