android studio 串口读写同步操作
时间: 2025-02-10 20:07:09 浏览: 38
### 在 Android Studio 中实现串口通信的同步读写
为了实现在 Android 设备上的 RS232 串口同步读写,通常需要借助 `android-serialport-api` 库来简化开发流程。该库提供了封装好的 API 接口用于处理底层硬件交互。
#### 准备工作
安装并配置好 Android NDK 和 CMake 工具链,在项目中引入第三方依赖项 `android-serialport-api`[^3]:
```gradle
dependencies {
implementation 'com.github.jiajiasailong:android-serialport-api:v1.0'
}
```
#### 创建 Java 类管理串口设备连接状态
定义一个名为 SerialPortManager 的类负责打开/关闭端口以及执行数据传输任务:
```java
public class SerialPortManager {
private static final String TAG = "SerialPortManager";
// 成员变量声明
private File device;
private int baudrate;
private int flags;
public SerialPort open(String path, int baudrate, int flags) throws SecurityException, IOException{
this.device=new File(path);
this.baudrate=baudrate;
this.flags=flags;
return new SerialPort(device, baudrate, flags);
}
public void close(SerialPort serialPort){
if (null != serialPort && !serialPort.isClosed()){
try {
serialPort.close();
} catch (IOException e) {
Log.e(TAG,"Failed to close the port",e);
}
}
}
}
```
#### 编写 JNI 方法完成具体的数据交换逻辑
编写 native 层函数以调用本地代码中的 read/write 操作,并将其映射至 Java 环境下供应用程序调用[^2]:
```c++
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_serialport_SerialPort_read(JNIEnv *env,jobject thiz,jbyteArray buffer){
jsize length = env->GetArrayLength(buffer);
char* cBuffer=(char*)malloc(length*sizeof(char));
memset(cBuffer,'\0',length);
jclass cls = env->GetObjectClass(thiz);
jfieldID fdFieldId = env->GetFieldID(cls,"fd","I");
int fileDescriptor = env->GetIntField(this,fdFieldId);
ssize_t bytesRead=read(fileDescriptor,cBuffer,length);
if(bytesRead>0){
env->SetByteArrayRegion(buffer,0,(jsize)bytesRead,reinterpret_cast<jbyte*>(cBuffer));
}
free(cBuffer);
return bytesRead<0 ? -errno : bytesRead;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_serialport_SerialPort_write(JNIEnv *env,jobject thiz,jbyteArray data){
size_t length = env->GetArrayLength(data);
const char* bytes = reinterpret_cast<const char *>(env->GetByteArrayElements(data,null));
jclass cls = env->GetObjectClass(thiz);
jfieldID fdFieldId = env->GetFieldID(cls,"fd","I");
int fileDescriptor = env->GetIntField(this,fdFieldId);
ssize_t bytesWritten=write(fileDescriptor,bytes,length);
env->ReleaseByteArrayElements(data,const_cast<jbyte*>(reinterpret_cast<const jbyte*>(bytes)),JNI_ABORT);
return bytesWritten<0?-errno:bytesWritten;
}
```
上述代码片段展示了如何利用 JNI 技术桥接 Java 与 C++ ,从而达到高效稳定的字节流收发效果。
#### 使用线程机制保障 I/O 操作的安全性和稳定性
考虑到串行接口的特点——即每次仅能按顺序发送或接收有限数量的信息包;因此建议采用独立的工作线程专门从事这项耗时的任务,以免阻塞主线程影响用户体验[^1]。
可以考虑使用 HandlerThread 或者 AsyncTask 来异步加载资源的同时保持界面响应灵敏度。不过题目特别指明要探讨的是 **同步** 方式,则可以直接在子线程内等待直到操作完成再返回结果给 UI 更新显示即可。
---
阅读全文
相关推荐


















