文档介绍:该【android-蓝牙-单片机-显示波形 】是由【帅气的小哥哥】上传分享,文档一共【16】页,该文档可以免费在线阅读,需要了解更多关于【android-蓝牙-单片机-显示波形 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。(希望可以上传成功)写在前面:最近一个月,自己尝试了开发一款手机应用,通过单片机的串口连接蓝牙模块发送数据,然后在手机端通过手机蓝牙收取数据,并将数据显示出来,其实这就是一个串口通信要做的事情,但是我要做的除此之外,还要将数据通过图像画出来。即是要求单片机通过AD采集模拟信号把转换出来的数字量通过蓝牙发送,在手机端将采集到的波形画出来。此文主要涉及蓝牙操作,画图,等。也给爱好单片机的一份参考。关于单片机连接的蓝牙是一个淘宝上买的模块,推荐个网址:http://item./?spm=**********.&id=**********&我是在这里买的,其中店家会给资料说明。Byways(没有抄袭任何人的原作,只是查找资料,看别人程序,自己开发,很大一局部来自androidsdk/doc/,因为自己深感网上资料冗杂,在此整理,借助百度文库的话,让每个人能有平等提升自己的时机,希望像我的android启蒙老师mars一样提供给大家免费的资料,讨厌那些需要积分的网站,比方程序员联合开发网,比方CSDN,因为没有积分,好几个看上的资源都不能下载。个人微博:http://blog./u/2698171342)程序目前问题:我成认自己现阶段的程序存在bug,但已经根本完成,关于最后的退出处理,会抛出异常,这个我还没解决,不过貌似应该是没有结束线程出现的问题;还有关于程序我几乎全部使用全局变量,因为比较简单,便于操作,所以,呵呵,但是我知道这样肯定不好;另外我本想用几个不同的activity和service但是在其中的通信中用到播送,消息队列等,但我一直没有收到数据,所以最后不得已全部在一个activity中实现,这个表示初学也有很大困难,本例为我后者程序,也就是版本二吧。我会改善这些问题,因为我希望自己可以追求完美。先展示结果:图一是最后的图,图二只是演示可以画出正弦波,其中按钮开启蓝牙是直接默认连接一个设备,按钮sin是开始接受蓝牙数据并画图,图示中由于没有开蓝牙,故一直接收数据一直为0所以是画出的一条直线,关于去除,是因为在画布下方还有一个TextView空间使用来显示接受到的数据的。图一图二关于程序:其中的注释我已经写的很清楚在manifest中,添加蓝牙权限:</application> <uses-permissionandroid:name=""/><uses-permissionandroid:name=""/></manifest>:<?xmlversion=""encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas./apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="***@string/hello"/><LinearLayoutandroid:layout_width="wrap_content" android:layout_height="wrap_content"android:orientation="horizontal">"<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button"android:text="***@string/button"/> <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sin"android:text="***@string/sin"/> <Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/clear"android:text="***@string/clear"/></LinearLayout> <SurfaceView android:id="@+id/show" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/myview" android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="***@string/myview"/> /></LinearLayout>:<?xmlversion=""encoding="utf-8"?><resources><stringname="hello">HelloWorld,OscilloscopeActivity!</string><stringname="app_name">Oscilloscope</string><stringname="button">开启蓝牙</string><stringname="myview">参数显示:</string><stringname="sin">sin</string><stringname="buttonstart">搜索</string><stringname="buttonselect">选择设备</string><stringname="buttonsend">发送</string><stringname="input">pleaseinput</string><stringname="clear">去除</string></resources>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lassOscilloscopeextendsActivity{/**Calledwhentheactivityisfirstcreated.*/ finalintHEIGHT=320;//设置画图范围高度finalintWIDTH=450;//画图范围宽度finalintX_OFFSET=5;//x轴〔原点〕起始位置偏移画图范围一点privateintcx=X_OFFSET;//实时x的坐标intcenterY=HEIGHT/2;//y轴的位置TextViewmyview=null;//画布下方显示获取数据的地方finalUUIDuuid=("00001101-0000-1000-8000-00805F9B34FB");//uuid此为单片机蓝牙模块用//还有其他的uuid,这个可以再百度查到,暂不清楚其中的差异finalBluetoothAdaptermBluetoothAdapter=();//获取本手机的蓝牙适配器staticintREQUEST_ENABLE_BT=1;//一个常量而已,开启蓝牙时使用BluetoothSocketsocket=null;//用于数据传输的socketintREAD=1;//一个常量,用于传输数据消息队列的识别字onnectedThreadthread=null;//连接蓝牙设备线程staticinttemp=0;//临时变量用于保存接收到的数据privateSurfaceHolderholder=null;//画图使用,可以控制一个SurfaceViewprivatePaintpaint=null;//画笔SurfaceViewsurface=null;//Timertimer=newTimer();//一个时间控制的对象,用于控制实时的x的坐标,//使其递增,类似于示波器从前到后扫描TimerTasktask=null;//时间控制对象的一个任务/*关于画图类的几点说明*SurfaceView是View的继承类,这个视图里*内嵌了一个专门用于绘制的Surface。可以控制这个Surface的格式和尺寸。*SurfaceView控制这个Surface的绘制位置。**实现过程:------>*()获得SurfaceHolder对象----->(callback)*添加回调函数----->()获得Canvas对象并锁定画布------>*Canvas绘画------->(Canvascanvas)结束锁定画图,*并提交改变,将图形显示。**这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,*用来操纵surface。处理它的Canvas上画的效果和动画,控制外表,大小,像素等**其中有几个常用的方法,锁定画布,结束锁定画布**/***@OverridepublicvoidonCreate(BundlesavedInstanceState){(savedInstanceState);setContentView();myview=(TextView)findViewById();//获取控件对象Buttonbluetooth=(Button)findViewById();Buttonsin=(Button)findViewById();Buttonclear=(Button)findViewById();surface=(SurfaceView)findViewById();//初始化SurfaceHolder对象holder=();(WIDTH+50,HEIGHT+100);//设置画布大小,要比实际的绘图位置大一点paint=newPaint(); ();//画波形的颜色是绿色的,(3);(newMyButtonListener());//添加按钮***(newMyButtonClearListener());//添加按钮***(newCallback(){//按照上面注释,添加回调函数publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){drawBack(holder);//如果没有这句话,会使得在开始运行程序,整个屏幕没有白色的画布出现//直到按下按键,因为在按键中有对drawBack(SurfaceHolderholder)的调用}publicvoidsurfaceCreated(SurfaceHolderholder){//TODOAuto-generatedmethodstub}publicvoidsurfaceDestroyed(SurfaceHolderholder){//TODOAuto-generatedmethodstub}});//添加按钮***(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub newDrawThread().start();//线程启动 } });} classMyButtonListenerimplementsOnClickListener{ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub //如果没有翻开蓝牙,此时翻开蓝牙 if(!()){ IntentenableBtIntent=newIntent(); startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT); } //此处我已经知道我对应的蓝牙模块的地址,所以省去扫描,配对的过程, //如果从头开始的话,需要添加很多内容。 /* *这是获得在手机中已经存储的已经配对过的蓝牙信息 *Set<BluetoothDevice>devices=(); if(()>0){ for(Iteratoriterator=();();){ BluetoothDevicebluetoothdevice=(BluetoothDevice)(); (()); ("\n"+()); //这里就是获取地址当然这里又不止一个信息,所有配对的信息都有, *你要选择蓝牙模块的地址,其实地址只是一个说法,它实际上是一个虚拟通道, *我也不太清楚,就称之为地址了 } }*/ BluetoothDevicedevice=("20:13:03:18:10:09"); try{ socket=(uuid);//建立连接 ().cancelDiscovery(); //取消搜索蓝牙设备,不写也罢,因为我压根没搜索 (); //建立连接,如果连接成功,此时蓝牙模块中的显示当前连接状态的指示灯就不会闪烁了,