串口通信实例(浅谈基于Android平台的串口通信实现)
串口在数据通信中应用广泛,但安卓软件开发工具包将Java指定为第三方应用开发语言,使得C语言很难实现串口应用。尽管谷歌安卓发布了NDK原生开发工具包)来支持开发者用C/C语言开发安卓程序,但官方提供的技术指导相对来说还是比较简短的。通过在安卓平台下开发串口通信的应用实例,详细介绍了安卓NDK的开发过程,帮助开发者快速搭建平台。关键词:安卓;NDK;JNI;软件开发工具包;系列安卓是谷歌推出的基于Linux的开源手机操作系统。这是一个专门为对移动设备设计的软件平台,包括操作系统、中间件和一些关键应
3安卓NDK开发实例是安卓平台上的一个电台程序,通过调用串口API与外围电台芯片通信,然后控制电台芯片完成频道搜索和显示功能。安卓NDK的开发一般包括以下步骤:1) JNI界面设计;2)用C/C实现局部方法;3)生成动态链接库;4)将动态链接库复制到Java项目中生成。apk文件。首先,创建一个NDK项目,然后在这个文件夹下创建两个目录:jni和src。jni用于存储我们的C文件,src是调用C库的Java接口文件。然后创建JNI/SerVices Port . c,主要用于打开和关闭串口。JNIEXPORT job object JNICALL Java _ Android _ serial port _ Serial PoRT _ open(JNIEV * env,jobject thiz,jstring path,jint baudrate){……/* open device */const char * path _ utf=(*(env)-GetStringTofchars(env,path,is copy);LOGD(打开串行端口%s,路径_ utf);fd=打开(路径_utf,0 _ RDWR | 0 _ DIRECT | 0 _ SYNC);LOGD(‘开放’)(FD=% d’,FD);(* env)-ReleaseStringTofchars(env,path,path _ utf);…/*配置设备*/……结构术语cfgcfmakeraw(CFG);cfsetispeed(cfg,速度);cfset speed(CFG,speed);}在文件中,函数名定义如下:job object JNI调用Java _安卓_串口_串口_ open,这是JNI的标准。这个定义应该遵循以下格式:Java _ package name _ class name _ method name,然后创建文件jni/Android.mk这个文件是我们本地c代码的Makefile。文件内容local _ path:=$(调用my-dir)包含$(clear _ vars)Local _ module :=串行端口local _ src _ files3360=串行端口。clocal _ ldlib :=-lloginclude $(build _ shared _ library)local _ path 3360=$(调用my-dir)此语句用于指定编译路径,并通过调用宏my-dir Include $(CLEAR _ VARS)CLEAR _ VARS获得当前工作。此变量由编译系统提供,用于指示GNU生成文件。添加这个句子的主要目的是清理所有的本地文件,比如本地模块和本地文件。这个句子需要添加在每个新模块的开头。LOCAL_MODULE :=serial_port语句定义了模块名称,将来要编译的库或可执行程序将以它命名。如果你编译一个动态库或一个静态库,库名是libserial_port.so或libserial_port.a应该注意的是,系统在生成动态库或静态库时会自动添加库前缀。local _ src _ files :=serial port . c是要编译的源代码文件名列表。没有必要在这里列出头文件和包含的文件,因为编译系统会自动为您添加它们。短语include$(BUILD_SHARED_LIBRARY)表示将来生成的库是一个共享库,即一个动态链接库。然后,我们可以在cygwin下编译生成的库文件。如如图2所示,进入转到项目目录并运行ndk-build命令来生成一个名为libserial_port的文件。然后,写在src目录中的serialport.java文件被用于JNI接口调用。键码公共类串口{./*打开串口*/MFD=打开(设备。getaabsolutepath(),baudrate);//JNIprivate本机静态文件描述符打开(字符串路径,int波特率);公共本机void close();静态{系统.加载库('串行端口');}}私有本机静态文件描述符打开(字符串路径,int baudrate),带有native关键字,表示此方法是本地的。短语系统。加载库(“串行端口”)用于加载我们的C动态库。上面声明的方法的具体实现在我们加载的库中。完成以上工作后,我们可以根据对的具体应用,利用串口完成数据通信。本文通过按键搜索频道,显示具体的频段。界面的布局是用xml文件声明的,它主要包括两个Button和一个TextView视图。按键响应被添加到按钮中,当按钮被按下时,调频信号通过串行端口发送。
bforeward.setOnClickListener(新视图onClickListener(){公共无效OnClick(视图v){尝试{ MoutputStream。书写(')};moutputstream。书写(' " n ');} catch(IOexception e){ e . PrintStackTrace();} } });文本视图用于接收串口信息,显示调频受保护的无效数据已接收(最后一个字节[]缓冲区,最后一个整数大小){ runOnUiThread(新的可运行)({公共无效运行(){if (mReception!=null) {mReception.setText(新字符串(缓冲区,0,大小));} } });{}同时添加了菜单,当按下菜单键时可以选择"退出"或"关于“。//添加菜单选项@覆盖公共布尔值OnCreateOptionsMenu(菜单菜单){menu.add(0,0,0,r . string。关于);菜单。添加(0,1,1,字符串。退出);返回真;}//实现选择菜单的动作@Overridepublic布尔值onOptionsItemSelected(菜单项项){ int item _ id=item。GetItemID();开关(item _ id){ case 0:…case 1:主菜单。这个。完成();打破;{}返回true{}编译运行该工程,就可以生成apk文件了。将apk文件和libserial_port.so安装到机器人平台后,运行该应用程序,运行结果如图所示4 .结论安卓NDK使C语言开发人员也能参与到机器人应用程序的开发中,增加代码的重用性。文中通过搭建串口应用的C代码底层接口,验证了其平台的可用性。但目前NDK还处于初级阶段,官方表示后期将提供更多的库,相信今后机器人会对组件支持"更完善。