把之前在新浪博客里写的分享也备份移植到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 

Java代码  
  1.   
  2. #include   
  3. #include   
  4. #include   
  5. #include <assert.h>  
  6.   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14.   
  15. #include "android/log.h"  
  16. static const char *TAG = "serial_port";  
  17. #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)  
  18. #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)  
  19. #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)  
  20.   
  21. static speed_t getBaudrate(jint baudrate) {  
  22.     switch (baudrate) {  
  23.     case 0:  
  24.         return B0;  
  25.     case 50:  
  26.         return B50;  
  27.     case 75:  
  28.         return B75;  
  29.     case 110:  
  30.         return B110;  
  31.     case 134:  
  32.         return B134;  
  33.     case 150:  
  34.         return B150;  
  35.     case 200:  
  36.         return B200;  
  37.     case 300:  
  38.         return B300;  
  39.     case 600:  
  40.         return B600;  
  41.     case 1200:  
  42.         return B1200;  
  43.     case 1800:  
  44.         return B1800;  
  45.     case 2400:  
  46.         return B2400;  
  47.     case 4800:  
  48.         return B4800;  
  49.     case 9600:  
  50.         return B9600;  
  51.     case 19200:  
  52.         return B19200;  
  53.     case 38400:  
  54.         return B38400;  
  55.     case 57600:  
  56.         return B57600;  
  57.     case 115200:  
  58.         return B115200;  
  59.     case 230400:  
  60.         return B230400;  
  61.     case 460800:  
  62.         return B460800;  
  63.     case 500000:  
  64.         return B500000;  
  65.     case 576000:  
  66.         return B576000;  
  67.     case 921600:  
  68.         return B921600;  
  69.     case 1000000:  
  70.         return B1000000;  
  71.     case 1152000:  
  72.         return B1152000;  
  73.     case 1500000:  
  74.         return B1500000;  
  75.     case 2000000:  
  76.         return B2000000;  
  77.     case 2500000:  
  78.         return B2500000;  
  79.     case 3000000:  
  80.         return B3000000;  
  81.     case 3500000:  
  82.         return B3500000;  
  83.     case 4000000:  
  84.         return B4000000;  
  85.     default:  
  86.         return -1;  
  87.     }  
  88. }  
  89.   
  90.   
  91. JNIEXPORT jobject JNICALL native_open(JNIEnv *env, jobject thiz, jstring path,jint baudrate) {  
  92.     int fd;  
  93.     speed_t speed;  
  94.     jobject mFileDescriptor;  
  95.   
  96.     LOGD("init native Check arguments");  
  97.       
  98.     {  
  99.         speed = getBaudrate(baudrate);  
  100.         if (speed == -1) {  
  101.               
  102.             LOGE("Invalid baudrate");  
  103.             return NULL;  
  104.         }  
  105.     }  
  106.   
  107.     LOGD("init native Opening device!");  
  108.       
  109.     {  
  110.         jboolean iscopy;  
  111.         const char *path_utf = env->GetStringUTFChars(path, &iscopy);  
  112.         LOGD("Opening serial port %s", path_utf);  
  113. //      fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);  
  114.         fd = open(path_utf, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);  
  115.         LOGD("open() fd = %d", fd);  
  116.         env->ReleaseStringUTFChars(path, path_utf);  
  117.         if (fd == -1) {  
  118.               
  119.             LOGE("Cannot open port %d",baudrate);  
  120.               
  121.             return NULL;  
  122.         }  
  123.     }  
  124.   
  125.     LOGD("init native Configure device!");  
  126.       
  127.     {  
  128.         struct termios cfg;  
  129.         if (tcgetattr(fd, &cfg)) {  
  130.             LOGE("Configure device tcgetattr() failed 1");  
  131.             close(fd);  
  132.             return NULL;  
  133.         }  
  134.   
  135.         cfmakeraw(&cfg);  
  136.         cfsetispeed(&cfg, speed);  
  137.         cfsetospeed(&cfg, speed);  
  138.   
  139.         if (tcsetattr(fd, TCSANOW, &cfg)) {  
  140.             LOGE("Configure device tcsetattr() failed 2");  
  141.             close(fd);  
  142.               
  143.             return NULL;  
  144.         }  
  145.     }  
  146.   
  147.       
  148.     {  
  149.         jclass cFileDescriptor = env->FindClass(";  

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. Android开发从Dagger2迁移至Kodein的感受
  6. Android开发中修改程序字体
  7. Android高仿网易新闻客户端之首页
  8. shape 的创建和使用
  9. AndroidStudio部署项目时出现错误:Instant Run requires 'Tools |

随机推荐

  1. Android自定义对话框
  2. android SurfaceView 绘图
  3. Paint---PorterDuffXfermode
  4. adb获取activity信息
  5. Android(安卓)Volley自定义Request(JSON)
  6. (Android) Eclipse "launching delegate"
  7. Android(安卓)再按一次退出程序
  8. Android(安卓)CardView 在eclipse中如何
  9. Android(安卓)SDK Tools, Revision 20 发
  10. android 滑动加载数据