首页 - 范文大全 - 文章正文

串口通信实例(浅谈基于Android平台的串口通信实现)

时间:2020-09-18 22:40:37 作者:黑曼巴 分类:范文大全 浏览:99

串口在数据通信中应用广泛,但安卓软件开发工具包将Java指定为第三方应用开发语言,使得C语言很难实现串口应用。尽管谷歌安卓发布了NDK原生开发工具包)来支持开发者用C/C语言开发安卓程序,但官方提供的技术指导相对来说还是比较简短的。通过在安卓平台下开发串口通信的应用实例,详细介绍了安卓NDK的开发过程,帮助开发者快速搭建平台。关键词:安卓;NDK;JNI;软件开发工具包;系列安卓是谷歌推出的基于Linux的开源手机操作系统。这是一个专门为对移动设备设计的软件平台,包括操作系统、中间件和一些关键应

串口在数据通信中应用广泛,但安卓软件开发工具包将Java指定为第三方应用开发语言,使得C语言很难实现串口应用。尽管谷歌安卓发布了NDK原生开发工具包)来支持开发者用C/C语言开发安卓程序,但官方提供的技术指导相对来说还是比较简短的。通过在安卓平台下开发串口通信的应用实例,详细介绍了安卓NDK的开发过程,帮助开发者快速搭建平台。关键词:安卓;NDK;JNI;软件开发工具包;系列安卓是谷歌推出的基于Linux的开源手机操作系统。这是一个专门为对移动设备设计的软件平台,包括操作系统、中间件和一些关键应用。其软件架构由四层组成,从高到低依次为应用层、应用框架层、系统运行层和linux内核层,如图如图1所示。每个安卓应用都运行在自己的进程中,并有一个独立的达尔维克虚拟机实例。在安卓发布的早期,谷歌称其虚拟机达尔维克支持JNI编程,即第三方应用可以使用JNI调用自己的C动态库,但谷歌官方并没有明确支持开发者使用这种方法。最后,在2009年6月,谷歌安卓发布了NDK,支持开发者使用C/C语言开发安卓程序。作为安卓软件开发工具包的附加组件,开发者必须在使用NDK之前安装安卓软件开发工具包。NDK的目的是增加代码的可重用性,加快程序的运行速度,这有利于开发者将其他系统的软件移植到安卓平台上。安卓系统简介安卓系统上应用程序的开发主要基于Java语言。要使用c或c程序或库,您需要使用NDK来实现它们。NDK是本地开发工具包的缩写。它是一个工具集,集成了安卓的交叉编译环境,并提供了一套方便的Makefile,可以帮助开发人员快速开发C或C动态库,并自动将C或C动态库和java程序打包到apk中在安卓上运行。使用NDK:有两个原因。一是合理地重用现有代码。二是提高程序某些关键部分的执行效率。安卓NDK目前是作为安卓软件开发工具包的附加组件提供的,开发者必须在使用NDK之前安装安卓软件开发工具包。Cygwin通常用于Windows平台下的NDK开发。Cygwin是一个可以在视窗平台上运行的UNIX/Linux模拟器。运行Cygwin后,将出现一个类似于窗口CMD的外壳环境界面,并且可以使用大多数的Linux软件和功能。使用它,我们可以很容易地在视窗平台上编译Linux平台的库文件或应用程序。2 NDK开发环境的安装和配置2.1要安装NDK,必须完全安装软件开发工具包,并尽可能将其升级到最新版本。本文使用的是SDK版本2.1。然后下载NDK。官方网站有三个版本:Windows、Mac OS X(英特尔)和Linux32/64(x86),它们可以在下载和解压缩后使用。本文使用的是视窗版的NDK,版本是android-ndk-r5。把它解压到一个特定的目录下,我们在:“安卓”安卓-ndk-r5目录下安装NDK。2.2要安装Cygwin,首先到Cygwin官方网站下载网络安装程序,然后点击直接运行。安装过程中最重要的是选择要安装的软件包。要支持安卓NDK的开发,选择默认,然后安装以下模块:autoconf2.1、automake1.10、binutils、gcc-core、gcc4-core、gdb、pcre、pcre-develop和GNU awk。让我们开始将安卓NDK配置到Cygwin中。运行Cygwin,修改。在Cygwin目录(/home/usrname)中的bash_profile文件中,在文件末尾添加以下代码,ndk=/Cyg drive/d/AnDroid/AnDroid-ndk-R5 export ndk并重新启动Cygwin。输入cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5的信息,则表示环境变量设置成功。然后我们可以使用Cygwin来编译我们的NDK代码。

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还处于初级阶段,官方表示后期将提供更多的库,相信今后机器人会对组件支持"更完善。

上一篇:地球下载(地球)

下一篇:关于关海伦.凯勒的资料(读好书伴我成长
——读海伦.凯勒自传有感)

猜你喜欢
发布评论
登录后发表评论
登录后才能评论

AI 新用户?

免费使用内容重写服务

开始新的写作