您的位置:首页 > 移动开发

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

2018-01-06 22:25 267 查看
这个是蓝牙小车的下篇,上篇的地址为: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;

}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: