一、串口基礎知識
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-hant/n/184062.html
微信掃一掃
支付寶掃一掃