前一篇文章提到我们的外接设备里有打印机,一开始是直接用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();