以下是在 Android 平台上实现串口通信的代码示例。
要实现串口通信,需要先创建一个类来处理串口通信。下面是一个名为 SerialPortHelper 的串口帮助类的示例:
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SerialPortHelper {
private static final String TAG = "SerialPortHelper";
private static final String SERIAL_PORT_DEVICE = "/dev/ttyS0"; // 串口设备路径
private static final int SERIAL_PORT_BAUD_RATE = 9600; // 波特率
private static final int MSG_RECEIVED_DATA = 0x01;
private final Context mContext;
private final OnDataReceivedListener mListener;
private final Handler mHandler;
private SerialPort mSerialPort;
private FileInputStream mInputStream;
private FileOutputStream mOutputStream;
private ReadThread mReadThread;
public SerialPortHelper(Context context, OnDataReceivedListener listener) {
mContext = context;
mListener = listener;
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_RECEIVED_DATA:
if (mListener != null) {
mListener.onDataReceived((byte[]) msg.obj);
}
break;
default:
break;
}
}
};
}
public void open() {
try {
mSerialPort = new SerialPort(new FileDescriptor(), SERIAL_PORT_DEVICE, SERIAL_PORT_BAUD_RATE);
mInputStream = mSerialPort.getInputStream();
mOutputStream = mSerialPort.getOutputStream();
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() {
if (mReadThread != null) {
mReadThread.interrupt();
}
if (mSerialPort != null) {
mSerialPort.close();
mSerialPort = null;
}
}
public void send(byte[] data) {
if (mOutputStream != null) {
try {
mOutputStream.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public interface OnDataReceivedListener {
void onDataReceived(byte[] data);
}
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
try {
if (mInputStream != null && mInputStream.available() > 0) {
byte[] buffer = new byte[1024];
int size = mInputStream.read(buffer);
byte[] data = new byte[size];
System.arraycopy(buffer, 0, data, 0, size);
mHandler.obtainMessage(MSG_RECEIVED_DATA, data).sendToTarget();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
SerialPortHelper 类有三个主要方法:
open():打开串口,并初始化输入和输出流。
close():关闭串口和输入输出流。
send():发送数据到串口。
这个类还有一个内部类 ReadThread,它会在后台运行,等待读取串口数据,并将数据发送给回调接口 OnDataReceivedListener。当有数据接收到时,它会交给 mHandler 处理,通过发送一个消息 MSGRECEIVEDDATA,而不是直接调用回调方法。
下面是 SerialPort 类的代码,在 SerialPortHelper 类中被使用:
import android.util.Log;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SerialPort {
private static final String TAG = "SerialPort";
private final String mDevicePath;
private final int mBaudRate;
private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;
// JNI调用C库函数,打开串口
private native static FileDescriptor open(String path, int baudrate);
// JNI调用C库函数,关闭串口
private native void close();
static {
System.loadLibrary("serial_port");
}
public SerialPort(String devicePath, int baudRate) {
mDevicePath = devicePath;
mBaudRate = baudRate;
}
public void open() throws IOException {
mFd = open(mDevicePath, mBaudRate);
if (mFd == null) {
Log.e(TAG, "open() failed, mFd == null");
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}
public FileDescriptor getFd() {
return mFd;
}
public FileInputStream getInputStream() {
return mFileInputStream;
}
public FileOutputStream getOutputStream() {
return mFileOutputStream;
}
public void close() {
try {
if (mFileInputStream != null) {
mFileInputStream.close();
}
if (mFileOutputStream != null) {
mFileOutputStream.close();
}
close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是一个串口通信的例子,其中使用了 JNI 调用 C 库函数来打开和关闭串口。
C 库函数的源代码不在此提供,但你可以根据自己的需要实现自己的 C 库。请确保在代码中具有足够的错误处理功能,以确保在发生错误时,您可以正确地关闭串口并释放资源。