Android串口开发之使用串口开发之使用JNI实现实现ANDROID和串口通信详解和串口通信详解
一:串口通信简介一:串口通信简介
前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一
些心得分享给大家,由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文
章,android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序 ,串口通信和java操作io类似,先打开串口,然后向串口发送或者读取数据,最后
关闭串口,所以基本思路就是:
1.对串口文件进行配置(波特率等),选择串口文件,打开串口,设备不同 ,可以读写的串口也不同.
2.读写串口 ,读串口需要开一个子线程,然后死循环读取串口发送的数据
3.关闭串口文件
其中打开,关闭串口是在jni方法执行,读写操作是android程序执行。
二:代码实现二:代码实现
我的开发环境是android studio 2.3.3 串口开发我创建一个支持c++项目,然后在cpp目录下,创建一个nateve-lib.cpp的程序,将串口打开,串口关闭的
程序复制进去即可,native-lib程序中方法的命名规则需要根据你实际情况,稍作修改,cpp中方法名格式为,Java_包名_调用jni方法的类名_方法名,如
Java_com_serialportdemo_SerialPort_open,此处一定要注意,android studio生成的是cpp程序,不是c程序,这两个有一些区别的,比如:
我对我对c也不熟悉,以下语法有误请指出也不熟悉,以下语法有误请指出
*.c的语法
变量定义
jstring jstr2 = (*env) -> NewStringUTF(env, cstr);
方法定义
JNIEXPORT jstring JNICALL Java_com_serialportdemo_MainActivity_encode()
JNIEXPORT jstring JNICALL Java_com_serialportdemo_MainActivity_decode()
*.cpp的语法
jstring jstr2 =env->NewStringUTF(hello.c_str());
extern "C" //如果这里不写extern "C",程序编译不会错,但android无法调用该方法,错误日志是找不到该方法
JNIEXPORT jstring JNICALL Java_com_serialportdemo_MainActivity_encode()
extern "C"
JNIEXPORT jstring JNICALL Java_com_serialportdemo_MainActivity_decode()
串口打开,串口关闭代码如下:
//获取波特率
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;
}
}
//打开串口程序
extern "C"
评论0