最近一个项目是android的系统,由于是工业产品,所以要用到串口,想着怎么去控制串口,有好些办法,最简单有效而且规范的办法就是google提供的NDK啦,其实还是蛮复杂的,因为android系统是个很花的系统,涉及到的知识面太广了。把代码贴在这,以后就不会忘了,嘎嘎.

下面是NDK部分所有的代码,需要注意的地方在最后面再讲:

/*

*Copyright 2100 Smallfish

*

*

*

*

*I love you.

*/

#include

#include

#include

#include

#include

#include

#include

#include

/*Android log

*/

#include

static const char *TAG="serialport for NFC Demo";

#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;

}//end of switch

}//end of getBaudrate

/*

*Class:  SerialPort

*Method:  open

*Signature:  (Ljava/lang/String;)V

*/

JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open

(JNIEnv *env,jobject thiz,jstring path,jint baudrate)

{

int fd;

jobject mFileDescriptor;

speed_t speed;

/*Check baudrate */

{

speed = getBaudrate(baudrate);

if(-1 == speed)

{

LOGE("Invalid baudrate passed");

return NULL;

}

}//end of check baudrate

/* Open device */

{

jboolean iscopy;

const char *path_utf = (*env)->GetStringUTFChars(env,path,&iscopy);

LOGD("Opening serial port is:%s",path_utf);

fd = open(path_utf,O_RDWR);

LOGD("opend device fd:%d",fd);

(*env)->ReleaseStringUTFChars(env,path,path_utf);

if(-1 == fd)

{

LOGD("Open serial port Failed...");

return NULL;

}

}//end of Open Device

/* Configure device*/

{

struct termios s_cfg;

if(tcgetattr(fd,&s_cfg))

{

LOGE("Get default config failed...");

return NULL;

}

cfmakeraw(&s_cfg);

cfsetispeed(&s_cfg,speed);

cfsetospeed(&s_cfg,speed);

if(tcsetattr(fd,TCSANOW,&s_cfg))

{

close(fd);

LOGE("Configure serial port failed");

return NULL;

}

}//end of Configure device

/* Create a corresponding file descriptor via opend serial port*/

{

jclass cFileDescriptor = (*env)->FindClass(env,"java/io/FileDescriptor");

jmethodID iFileDescriptor = (*env)->GetMethodID(env,cFileDescriptor,"","()V");

jfieldID  descriptorID = (*env)->GetFieldID(env,cFileDescriptor,"descriptor","I");

mFileDescriptor = (*env)->NewObject(env,cFileDescriptor,iFileDescriptor);

(*env)->SetIntField(env,mFileDescriptor,descriptorID,(jint)fd);

}

return mFileDescriptor;

}//end of open

/*

* Class: serial__SerialPort

* Method: close

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close

(JNIEnv *env,jobject thiz)

{

jclass SerialPortClass = (*env)->GetObjectClass(env,thiz);

jclass FileDescriptorClass = (*env)->FindClass(env,"java/io/FileDescriptor");

jfieldID mFdID = (*env)->GetFieldID(env,SerialPortClass,"mFd","java/io/FileDescriptor");

jfieldID descriptorID = (*env)->GetFieldID(env,FileDescriptorClass,"descriptor","I");

jobject mFd = (*env)->GetObjectField(env,thiz,mFdID);

jint descriptor = (*env)->GetIntField(env,mFd,descriptorID);

LOGD("Close device fd:%d",descriptor);

close(descriptor);

}

需要注意的是函数名称:Java_android_serialport_SerialPort_close

分解如下:Java_这个是不变的,照写就是了,android_serialport这个是包名,这里是什么,在上层里也必须是什么,SerialPort_close这个前面部分是类名,而后面的当然就是函数名称了。

好吧:就这样,以后补上.mk文件.

下面是整个java串口类的代码,就不多说了:

package android.serialport;

import java.io.File;

import java.io.FileDescriptor;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.util.Log;

public class SerialPort

{

private FileDescriptor mFd;

private FileInputStream mFileInputStream;

private FileOutputStream mFileOutputStream;

//这是构造函数了,是做什么的我也不知道啊

public SerialPort(File device,int baudrate) throws SecurityException,IOException

{

//open device

mFd = open(device.getAbsolutePath(),baudrate);

if(mFd == null)

{

Log.e(TAG, "native open return NULL");

throw new IOException();

}

//建立输入输出流,就可以使用这2个流来发送和接收数据了

mFileInputStream = new FileInputStream(mFd);

mFileOutputStream = new FileOutputStream(mFd);

}//end of SerialPort

//获取输入流

public InputStream GetInputStream()

{

return mFileInputStream;

}

//获取输出流

public OutputStream GetOutputStream()

{

return mFileOutputStream;

}

//加载库和声明函数的

private native static FileDescriptor open(String path,int baudrates);

private native void close();

static {

System.loadLibrary("serialport");

}

}//end of calss

android ndk串口触屏,Aandroid NDK开发之串口控制相关推荐

  1. 手机触屏版页面开发总结

    经过一年的触屏版开发,每一个项目开始前总要做大量的准备,力求做到完美,但做下一个项目的时候总会发现上一个项目有着太多的不足.这应该就是成长吧!虽然不是什么大牛但也觉得有必要把一些技巧和经验记录下来,以 ...

  2. 〖Android〗屏幕触屏事件录制与回放

    需求: 不管是做自动化测试的,还是传媒技术的,自动化操作Android App是一种操作需求: 自动化的操作可以节省很多的人力资源投入: 实现: Android UI界面的自动化,通常有两个方法: 1 ...

  3. [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印

        前一篇文章讲述了Android实现图片Matrix矩阵类缩放.旋转.对比度.亮度.饱和度处理,但是真正的图片软件都是使用触屏实现图片缩放.移动.添加水印等功能,所以该篇文章主要通过setOnT ...

  4. android 触摸 事件,Android触屏事件和MotionEvent详解

    Android屏幕操作 屏幕是用户和Android设备交互的主要媒介,屏幕分为触屏和非触屏.Android设备目前有四种类型:Android Phone,Android Tablet,Android ...

  5. 小爱触屏音响用php接口,小米小爱触屏音箱:这个“闹钟”不简单

    2019年4月1日更新:(不是愚人节新闻)小米高级副总裁.中国区总裁王川宣布,小米小爱触屏音箱将于4月9日小米9周年感恩狂欢上正式发布,定价为299元.此前,这款音箱已有超过42万人参与公测. 这是触 ...

  6. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  7. Android开发板串口(SerialPort)通信

    Android开发板串口(SerialPort)通信 Roy88关注 22017.09.07 18:01:22字数 1,618阅读 28,511 前言: 最近在总是看见有人在群里面问一些串口通信相关的 ...

  8. Android NDK开发之旅1 NDK介绍

    ###一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Ja ...

  9. Android 中Touch(触屏)事件传递机制

    版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...

  10. 触屏型测控电路:串口助手网络ping包 带笔划输入法 硬件终结版

    测控方面的设计可能有的工程师已经做得多了,可是用的都是VC.VB或者CVI等等,都逃不过电脑,但没人喜欢抱着台电脑到处走动测试(比如我就很讨厌这样的传统测试方法),人们需要更新的测控理念,下面我将介绍 ...

最新文章

  1. Android之----Log详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  2. HDU1166-敌兵布阵
  3. html5--3.7 input元素(6)
  4. careercup-递归和动态规划 9.2
  5. CentOS 7.x防火墙问题
  6. 【原】聊聊js代码异常监控
  7. pytorch之model.zero_grad() 与 optimizer.zero_grad()
  8. 单片机sleep函数的头文件_关于PIC单片机SLEEP指令
  9. python 快速排名发包_SEO怎么快速排名?SEO快排发包技术原理是怎么实现的呀?(悬赏5元) - 搜外问答...
  10. python生成的exe反编译
  11. 小米air2se耳机只有一边有声音怎么办_小米蓝牙耳机Air2 SE,169元是否值得购买?值...
  12. Matlab实现均值滤波
  13. Matlab R2019a Win64位 迅雷下载链接
  14. matlab计算惯性矩,动力总成主惯性矩计算及扭矩轴(TRA)位置确定
  15. 【python教程入门学习】Python转义字符及用法
  16. 使用spoon对java代码进行转换
  17. 逆向分析工具IDA与开源工具Ghidra、Cutter对比测评
  18. 亿级视频内容如何实时更新?
  19. 文献综述格式及写作技巧
  20. Android JetPack Room

热门文章

  1. ThinkPHP中使用聚合查询去重求和
  2. 如何在Java应用中提交Spark任务?
  3. Servlet生命周期与线程安全
  4. Linux误删C基本运行库libc.so.6处理方法
  5. iOS已发布应用中对异常信息捕获和处理(转)
  6. 解决Win7下JMF读取摄像头错误
  7. 190308每日一句
  8. 190303每日一句
  9. Atitit 非结构化数据管理法 目录 1. 什么是非结构化数据? 1 2. 对非结构化数据也即对全文数据的搜索主要有两种方法: 2 2.1. 顺序扫描法(Serial Scanning): 2 2
  10. Atitit nlp 自然语言处理的艺术 attilax著作 v2 t55.docx Atitit nlp 自然语言处理attilax总结 目录 1.1. 主要范畴 1 1.2. 研究难点