基于51单片机的蓝牙小车手机端遥控的简单实现 (下篇)

这个是蓝牙小车的下篇,上篇的地址为:http://blog.csdn.net/lpstudy/article/details/78992038

源代码:
https://github.com/lpstudy/bluetooth-car

此帖子为昨天发的帖子http://bbs.elecfans.com/jishu_544143_1_1.html的后续版本,昨天已经实现了小车前进,后退,拐弯,获取小车信息,获取帮助等功能了。

昨天的程序有一个明显的问题,手机端按下前进按键后,小车会前进一段时间(命令可配置,上一篇文章中初始化配置为1000ms)。如果把时间调的很短,例如100ms,那么我们的手机端按键必须以小于100ms的间隔进行连续按键,才可以推动小车连续前进,而事实上,我们是达不到那么快的频率触发按键的。 这主要原因是我使用的蓝牙串口调试助手并没有带有按住按键,连续发送命令的功能。 它没有,我可以写呀。

今天花了一个上午,找到了一份android自带的蓝牙聊天源代码,其工程名字为bluetoothChat。 阅读了一下它的代码,然后加上我想要的按钮功能,给按钮加上按住连续命令的功能。当前我设置的是按住不丢以50ms的间隔连续发送命令。小车端设置的每一次按键的执行时间延迟为130ms。原来小车端使用100ms,手机端按住前进按键,小车的轮子运行10几秒大约有一两次停顿(按道理不应该,应为50ms远小于100ms了,但是估计由于蓝牙发送的,接收处理中间有一些突然的阻塞,导致问题),于是调整为新的130ms,这样手机端按住按键的时候,小车可以连续驱动,没有发现一点停顿。

今天主要说说手机端的代码(单片机端的代码就将100ms修改为130ms,其他没有作任何改动)
手机端使用的蓝牙demo工程: BluetoothChat
关于蓝牙搜索周边连接的代码,我一点没动
关于蓝牙通信的那一块代码,我一点没有动
主要修改了界面代码,以及按钮时间代码

界面代码中删除了旧的聊天的列表适配器,加入了新的按钮,新的EditText给按钮增加了事件,同时需要完成按住按钮连续自动发送命令的功能。

手机端寻找小车的HC05设备的界面如下:

手机端控制小车运动的简单的界面如下:

5个按钮用来控制小车的运转,下面的信息按钮用来向小车发送获取信息命令,小车将当前的状态反馈回来,并显示到“收到的数据”那个EditText中。 帮助按钮用来向小车发送帮助命令,小车返回其支持的命令列表,避免以后忘记了命令操作。下面的send按钮中也可以手动发送命令,而不是通过按钮发送,也就是说按钮发送的是定死的命令,下面的send可以发送任意的字符串。

关于连续发送命令的代码,使用的网上的一个代码,自己做了封装,此函数需要传递按钮的id,标题,以及要发送的消息
它就可以在用户按下按键不丢的时候,以每隔50ms的间隔发送message到小车端的蓝牙。

public void bindMutiplePressedButtonWithMessage(int buttonId, String title, final String message) {
            Button frontButton = (Button) findViewById(buttonId);
            frontButton.setText(title);


            frontButton.setOnTouchListener(new OnTouchListener(){ 
                    boolean longClicked = true;
            @Override  
            public boolean onTouch(View v, MotionEvent event)  
            {  
                   if(event.getAction() == MotionEvent.ACTION_DOWN) {  
                       longClicked = true;  
                       Thread t = new Thread(){  
                           @Override  
                           public void run(){  
                               super.run();  
                               while(longClicked)  
                               {  
                                   // Send the name of the connected device back to the UI Activity
                                   Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_TOSEND);
                                   msg.obj = message;
                                       mHandler.sendMessage(msg);
                                   try{  
                                       Thread.sleep(50);  
                                   }catch(InterruptedException e){  
                                       e.printStackTrace();  
                                   }  
                               }  
                           }  
                       };  
                       t.start();  

                   } else if(event.getAction() == MotionEvent.ACTION_UP) {  
                       longClicked = false;  
                   }  
                return true;    

            } 
        });  
        }

猜你喜欢

转载自blog.csdn.net/lipeng08/article/details/78992103