一、串口基礎知識
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串口通信的原理和實現方法,希望對讀者理解安卓串口通信有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/184062.html