Android串口通信:串口读写实例
16lz
2021-12-04
把之前在新浪博客里写的分享也备份移植到CSDN博客,之前本文博客地址是:http://blog.sina.com.cn/s/blog_14ed06d6c0102wqdl.html
在Android串口通信:基本知识梳理(http://gqdy365.iteye.com/admin/blogs/2188846)的基础上,我结合我项目中使用串口的实例,进行总结;
Android使用jni直接进行串口设备的读写网上已经有开源项目了,本文是基于网上的开源项目在实际项目中的使用做的调整和优化;
Google串口开源项目见:https://code.google.com/p/android-serialport-api/
下面是我项目中的相关代码及介绍:
1、SerialPort.cpp
- #include
- #include
- #include
- #include <assert.h>
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include "android/log.h"
- static const char *TAG = "serial_port";
- #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
- #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
- #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
- static speed_t getBaudrate(jint baudrate) {
- switch (baudrate) {
- case 0:
- return B0;
- case 50:
- return B50;
- case 75:
- return B75;
- case 110:
- return B110;
- case 134:
- return B134;
- case 150:
- return B150;
- case 200:
- return B200;
- case 300:
- return B300;
- case 600:
- return B600;
- case 1200:
- return B1200;
- case 1800:
- return B1800;
- case 2400:
- return B2400;
- case 4800:
- return B4800;
- case 9600:
- return B9600;
- case 19200:
- return B19200;
- case 38400:
- return B38400;
- case 57600:
- return B57600;
- case 115200:
- return B115200;
- case 230400:
- return B230400;
- case 460800:
- return B460800;
- case 500000:
- return B500000;
- case 576000:
- return B576000;
- case 921600:
- return B921600;
- case 1000000:
- return B1000000;
- case 1152000:
- return B1152000;
- case 1500000:
- return B1500000;
- case 2000000:
- return B2000000;
- case 2500000:
- return B2500000;
- case 3000000:
- return B3000000;
- case 3500000:
- return B3500000;
- case 4000000:
- return B4000000;
- default:
- return -1;
- }
- }
- JNIEXPORT jobject JNICALL native_open(JNIEnv *env, jobject thiz, jstring path,jint baudrate) {
- int fd;
- speed_t speed;
- jobject mFileDescriptor;
- LOGD("init native Check arguments");
- {
- speed = getBaudrate(baudrate);
- if (speed == -1) {
- LOGE("Invalid baudrate");
- return NULL;
- }
- }
- LOGD("init native Opening device!");
- {
- jboolean iscopy;
- const char *path_utf = env->GetStringUTFChars(path, &iscopy);
- LOGD("Opening serial port %s", path_utf);
- // fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);
- fd = open(path_utf, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
- LOGD("open() fd = %d", fd);
- env->ReleaseStringUTFChars(path, path_utf);
- if (fd == -1) {
- LOGE("Cannot open port %d",baudrate);
- return NULL;
- }
- }
- LOGD("init native Configure device!");
- {
- struct termios cfg;
- if (tcgetattr(fd, &cfg)) {
- LOGE("Configure device tcgetattr() failed 1");
- close(fd);
- return NULL;
- }
- cfmakeraw(&cfg);
- cfsetispeed(&cfg, speed);
- cfsetospeed(&cfg, speed);
- if (tcsetattr(fd, TCSANOW, &cfg)) {
- LOGE("Configure device tcsetattr() failed 2");
- close(fd);
- return NULL;
- }
- }
- {
- jclass cFileDescriptor = env->FindClass(";
更多相关文章
- 箭头函数的基础使用
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android开发从Dagger2迁移至Kodein的感受
- Android开发中修改程序字体
- Android高仿网易新闻客户端之首页
- shape 的创建和使用
- AndroidStudio部署项目时出现错误:Instant Run requires 'Tools |