您的位置:

安卓串口通信详解

一、串口基础知识

1、串口通信是指通过串行通信串口进行的数据传输方式,在计算机中广泛应用,其中包括安卓系统。

2、串口通信的基础是数据位、停止位、校验位的设置。

3、串口通信中数据的传输是按照位(bit)的方式进行的。

4、串口通信使用不同的波特率进行数据传输,常用的波特率有9600、115200等。

二、Android串口通信的实现

在安卓系统中,以USB串口转接线连接串口设备,在进行串口通信。

Android系统提供了serialPort类,用于实现串口通信。

三、Android串口通信的步骤

1、获取串口访问权限。Android系统规定只有ROOT用户才能访问串口设备,所以需要通过jni层来实现串口的访问权限。

private static String serial_port;//串口号
private static int speed = 115200;//波特率
private static int bits = 8;//数据位
private static String event = "N";//校验位
private static int stop = 1;//停止位
static {
   System.loadLibrary("serial_port");
}
public static native FileDescriptor open(String path, int baudrate, int num_data, char even_judg, int num_stop);
public static native void close();

public void setSpeed(int speed) throws Exception {
   this.speed = speed;
}
public void setPath(String path) throws Exception {
   this.serial_port = path;
}

public void setBits(int data_bits) {
   this.bits = data_bits;
}

public void setStop(int stop_bit) {
   this.stop = stop_bit;
}

public void setEvent(char event_judg) {
   this.event = String.valueOf(event_judg);
}

public void open() throws Exception {
   mFd = open(serial_port, speed, bits, event.charAt(0), stop);
}

public void closeDev() {
   close();
}

2、读取和发送数据。

public class SerialPortUtil {
   private ReadThread mReadThread;
   private static OnDataReceiveListener onDataReceiveListener = null;//数据接收监听
   private OutputStream mOutputStream;
   private InputStream mInputStream;
   private byte[] mBuffer = new byte[512];
   private boolean exit = false;

   /**
    * 打开串口
    * @throws SecurityException
    * @throws IOException
    * @throws InvalidParameterException
    */
   public void openSerialPort() throws SecurityException, IOException, InvalidParameterException {
       File device = new File("/dev/ttyS4");
       SerialPort serialPort = new SerialPort(device, 115200, 0);
       mOutputStream = serialPort.getOutputStream();
       mInputStream = serialPort.getInputStream();
   }

   /**
    * 发送数据
    * @param data
    */
   public void sendSerialPort(byte[] data) {
       try {
           if (mOutputStream != null) {
               mOutputStream.write(data);
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

   /**
    * 读取串口数据
    */
   public void startReadSerialPort() {
       mReadThread = new ReadThread();
       mReadThread.start();
   }

   /**
    * 停止读取串口数据
    */
   public void stopReadSerialPort() {
       if (mReadThread != null) {
           mReadThread.interrupt();
           mReadThread = null;
       }
   }

   /**
    * 设置数据监听的回调
    * @param onDataReceiveListener
    */
   public static void setOnDataReceiveListener(OnDataReceiveListener onDataReceiveListener) {
       SerialPortUtil.onDataReceiveListener = onDataReceiveListener;
   }

   /**
    * 串口数据监听接口
    */
   public interface OnDataReceiveListener {
       void onDataReceive(byte[] buffer, int size);
   }

   private class ReadThread extends Thread {
       @Override
       public void run() {
           super.run();
           while (!isInterrupted() && !exit) {
               int size;
               try {
                   byte[] buffer = new byte[64];
                   if (mInputStream == null) return;
                   size = mInputStream.read(buffer);
                   if (size > 0) {
                       if (onDataReceiveListener != null) {
                           onDataReceiveListener.onDataReceive(buffer, size);
                       }
                   }
               } catch (IOException e) {
                   e.printStackTrace();
                   return;
               }
           }
       }
   }
}

四、Android串口通信的注意事项

1、在进行串口通信前,先确保串口设备连接到Android设备上。

2、在使用串口时,需要同时打开读和写操作。

3、在Android应用中使用串口时,需要获取应用程序权限。

4、在Android7.0及以上版本,需要使用内容提供者或文件共享方式操作串口。

5、为确保数据正确性,建议在数据传输结束后,加上停止位。

五、代码示例

代码中演示了如何使用Android串口通信读取和发送数据。

SerialPortUtil serialPortUtil = new SerialPortUtil();
serialPortUtil.setOnDataReceiveListener(new SerialPortUtil.OnDataReceiveListener() {
   @Override
   public void onDataReceive(byte[] buffer, int size) {
       //处理接收到的串口数据
   }
});
serialPortUtil.openSerialPort();
serialPortUtil.startReadSerialPort();
serialPortUtil.sendSerialPort("hello".getBytes());
serialPortUtil.stopReadSerialPort();
serialPortUtil.closeSerialPort();

六、小结

本文详细介绍了Android串口通信的原理和实现方法,希望对读者理解安卓串口通信有所帮助。