蓝牙模块发送数据的数据是我们直接给它的吗?

查看: 5797|回复: 16
分享一下自己研究EV3蓝牙通信原理的成果 (完结)
本帖最后由 太空虫虫 于
22:47 编辑
写在最前面:本帖是介绍与EV3进行蓝牙通信的基本原理,所以可能需要一点计算机及编程语言方法的知识来帮助理解。另外,本帖不涉及如何编写手机APP等方面的知识,也没有现成的软件供下载,如果是有这方面需求的小伙伴,可以去搜搜论坛的其他帖子。谢谢~-----------------------------------------------------------------------------------------------------------------------
最近,想实现通过手机蓝牙控制EV3。在论坛找了一圈,发现掌握这方面知识的前辈蛮多了,但是无一例外都是在介绍自己编写的手机APP,对于如何与EV3进行蓝牙通信均没有介绍,虽然有些前辈愿意开源自己的APP源码,但如果没有一定的Java编程经验以及相应的开发软件的话,要解读起来还挺麻烦,所以,小弟通过官方的文档和反编译其他前辈的APP,了解了一点EV3进行蓝牙通信的基本原理。和大家分享一下,希望对大家有用。
& & 直接上图,我们先拿EV3间的通信为对象来进行研究。下图就是EV3间通信的基本框图& &
图片1.jpg (8.96 KB, 下载次数: 0)
22:53 上传
& && & 通过图大家可以发现一个叫mailbox的东西,MailBox是EV3自身底层操作系统虚拟出来的东西。 根据我的研究EV3上跑的用户程序要和外界通信,无论发送或接收都是通过这个MailBox来完成的。&&
图片2.jpg (13.13 KB, 下载次数: 1)
22:52 上传
& & 写过EV3之间蓝牙通信的小伙伴都应该用过上面这个指令,这个命令就是对MailBox进行读或写操作的指令。
& & 而一个比较麻烦的问题是,在EV3的眼中,外界的其他设备也都是EV3。也就是说,当它想发送信息给目标设备时,也只会把这个数据往自己的“MailBox”里面丢,当目标设备想发送信息给EV3时,也必须让信息能进入到它的MailBox里才行。&&那怎么样实现非EV3设备与EV3设备的通信呢?我们先根据EV3系统的结构对第一幅图进行展开,可以得到下面这幅图。&&
图片3.jpg (25.44 KB, 下载次数: 0)
22:52 上传
& && &为了更具体的说明上副图的含义,我们现在假设EV3甲的用户程序需要发送一个数据到EV3乙的用户程序中,那么在EV3甲中数据会先被丢入MailBox中,但是通过图我们可以看到,实际上MailBox是没办法直接把数据发送出去,而是把数据交给了一个叫“EV3协议处理程序”的东西。它是底层操作系统的一个后台程序,作用就是对需要发送出去的信息进行“打包“,对接收到的信息进行“拆包”。“EV3协议“是与EV3通信的关键,本帖后面会重点介绍。 那如上所说,EV3协议处理程序对数据进行打包完成后,就会通过CPU的数据接口把数据发送给EV3上的蓝牙模块(具体是什么接口我没有研究过,理论上是串口)。从这里开始,数据的发送就交由蓝牙模块负责了。& & EV3蓝牙模块内的蓝牙芯片会对要发送的数据再按照一个叫SPP的协议进行打包。SPP协议是蓝牙的子协议之一,有兴趣的小伙伴可以自己去百度一下,这里不做介绍,大家只需要知道EV3的蓝牙模块支持这个协议就好(好像也只支持这一个)。打包完成后数据终于能通过蓝牙模块的射频电路真正的被发送出去了。& & 当数据到达EV3乙后,经历的就是在EV3甲中的逆过程。数据在蓝牙模块按照SPP拆包后,又在CPU里被按照“EV3协议“再拆一次包后,数据最终到达了EV3乙的MailBox里。& & 讲了这么一大段EV3与EV3间的通信,那EV3如何与非EV3的设备进行通信呢?总结起来就是一句话:找一个带蓝牙且支持SPP的设备,按照EV3协议收发数据即可。而支持SPP的蓝牙设备满地都是,所以说掌握EV3协议就成为了与EV3通信的关键。
--------------------------------------------------------------------------------------------------------------& & EV3协议,乐高官方学名为direct commands,也就是“直接命令”,在乐高的官方文档“LEGO MINDSTORMS EV3 Communication Developer Kit”中有介绍。(有兴趣的小伙伴可以去官网/zh-cn/mindstorms/downloads下来看看)。“直接命令”类似与Windows里面的命令控制台命令,是内建在EV3底层操作系统里的,所以可以直接执行这些命令而无需编写任何用户程序。“直接命令”十分强大,可以实现命令EV3执行某个程序、直接读取EV3的输入口、直接控制输出口、下载、上传和删除文件、写MailBox等等的功能, 其中写MailBox就是我们所要介绍的。下达命令的实质就是按照官方文档里规定的协议格式,把数据打包后发送给EV3,EV3拿到数据交由协议处理程序拆包后,按照数据的内容执行相应的动作。下达“直接命令”有3个渠道,WIFI、USB和蓝牙,乐高的编程软件就是通过USB口给EV3下达“直接命令”来实现程序的下载上传等功能的,我们这里只需要通过蓝牙向EV3发送写MailBox命令就可以实现我们的目标了。
*******************************************************& & 下面就是重点了,关于“写MailBox命令”协议格式。****************************************************************官方的文档中定义的格式如下:
图片4.jpg (39.59 KB, 下载次数: 0)
22:58 上传
它由8个部分组成:代号& &&&长度& && && && & 含义bbbb:& & 2字节& && && &整个包从mmmm到ppp的数据长度, (小端模式保存)mmmm& &&&2字节& && && &包计数器,目前还不知道作用,直接填0就好。tt& && & 1字节& && && &包类型,直接填0x81就好。ss& && & 1字节& && && &命令类型, 0x9e代表写mailboxll& && &&&1字节& && && &mailbox名称字符串的长度 + 1,比如“abc” 的长度为4.aa…& && &ll字节& && &&&mailbox名称+0, 内容为字符的ASCII码 + 0x00LLLL& &&&2字节& && && &包有效数据长度,(小端模式保存)ppp…& & LLLL字节& && & 包有效数据,我们要丢到EV3 mailbox里的东西就放在这里& && & (小端模式保存:就是在保存超过一个字节的数据时把低位数据放在低地址,高位放高地址的保存方法,相应的还有大端模式)& & 额。。看完上面这堆东西大家还一头雾水,搞不懂是什么意思? 那就对了,要不然大家直接看文档就行了,我也用不着发这个帖子了。下面我尽量用简单的语音说明一下上诉内容的意思。首先说一下Mailbox支持放3种数据,逻辑、数值、字符串。
捕获.JPG (17.78 KB, 下载次数: 0)
23:07 上传
我们先拿逻辑类型的数据来举例。逻辑只有真和假两种状态,所以EV3协议规定用1字节来表示,真是1,假是0。 那么我们要给EV3的’abc’ mailbox发一个逻辑真的话,数据按如下步骤打包1. tt、ss、mmmm的内容按照开头的介绍填入规定值即可2. mailbox名称是用字符串表示的,字符串是由字符和结尾的0终止标识组成的,所以 ’abc’ 字符串的长度为 3+1 = 4,即ll 为4,aaa部分的内容为 0x61,0x62,0x63,0x00 (0x61为’a’的ASCII码,依次类推,字符最后加0x00为终止标识)3. 如上所说逻辑的数据使用一个字节表示,所以LLLL有效数据长度为1, 所以内容为 0x01,0x004. 因为要发送的是逻辑真,所以ppp的部分内容是0x01。5. 最后,通过计算,整个包的长度为 1(ppp) + 2(LLLL) + 4(aaa.) + 1(II) + 1(tt) + 1(ss) + 2(mmmm) = 12. 所以bbbb 填入 0x0c, 0x00
& & 所以,整个包是这样的(16进制表示),0x0c, 0x00, 0x00, 0x00, 0x81, 0x9e, 0x04, 0x61, 0x62, 0x63, 0x00, 0x01, 0x00, 0x01&&bbbb& && && & mmmm& && && && &tt& & ss& && && &ll& && && && && && &aaa.. & && && && && && && && && &LLLL& && &ppp
数值、字符串和逻辑只是LLLL和ppp两个部分不一样,其余都相同。字符串的规则比较简单。比如要给“abc” mailbox发送 “1234” 这个字符串的话。 LLLL内容为0x05, 0x00,&&ppp的内容就是 0x31, 0x32, 0x33, 0x34,0x00.& &&&数值EV3协议是用32位浮点数表示的,所以LLLL为4,ppp采用小端模式存放32位浮点数的4个字节。 具体比如50.5这样的数字怎么转换为4个字节的数据,是有一套规则的,但是我也不清楚,也没有必要搞清楚,因为使用C语言里的union的数据类型可以很方便的得到,这个后续实际应用篇再讲。
不好意思,由于不可描述的原因Delay一天了,现在一楼先把前天的知识补充完整(接上文)&&以上说的是我们自己的蓝牙设备发送数据给EV3,如果是EV3发送数据给我们的设备的话,从我们自己的蓝牙模块数据口输出的也同样是按照上诉规则打包的数据,我们只需要按照规则拆包就好。
& & 看完上诉的内容,可能会有小伙伴有这样的疑问,在解析包时EV3是如何区分这3种数据类型的? 如果发送的是由3个字符组成的字符串数据,那么就和发送数值类型数据的包的效数据长度一样都是4了,那EV3如何区分,答案是EV3不会区分,对于采用何种数据类型来解析包,是由用户程序决定的,比如用户程序里有如下一个命令,那么对于Mailbox名称为“abc”的包,EV3就会用数值类型来解析,哪怕发送方的本意是要发送3个字符的字符串,当然,最后解析出来的数值肯定是错误的。
图片5.jpg (10.63 KB, 下载次数: 0)
21:49 上传
& & 另外,小弟做过如下这样的实验,本来是想让同一个mailbox名称能同时接收两种数据类型,结果,无论用何种数据类型往“abc”里发送,都收不到任何的东西。具体原因可能和EV3底层操作系统对于包解析的运作规则有关,所以请保证一个mailbox名称在程序里只接收一种数据类型。
图片6.jpg (21.88 KB, 下载次数: 0)
21:49 上传
有意义的分享,感谢!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
本帖最后由 太空虫虫 于
22:48 编辑
& & 正所谓实践出真知,再多的理论知识,如果没有和实际使用相结合的话,始终是空洞和不知所措的,我想看完我上面一大堆的文字后的小伙伴们一定有这种感觉。所以,下面我给大家演示一下实际的应用,让大家更好的知道上面那堆文字所包含的知识如何运用。& & 首先说明一下,小弟我研究这些知识的最终目的是能够按照自己的需求写出手机APP,但是由于目前手机蓝牙方面的编程我自己还没学会(这也就是我开头说不涉及蓝牙编程和不提供手机APP的原因),所以只能通过其他途径和大家演示,可能会有些简陋,但应该不影响大家的理解。
& & 准备介绍的这种方法原始、简单、粗暴,可以让大家亲手感受与EV3通信的过程,大致方案是通过电脑的蓝牙适配器连接EV3后,用任意一款能以16进制模式收发的串口通信软件直接把数据发给EV3。
& & 第一步,找一个蓝牙适配器,小弟我用的是下图这种目前烂大街的品种。
图片7.jpg (9.57 KB, 下载次数: 0)
22:45 上传
& & 第二步,打开EV3上的蓝牙,设置可见,然后让EV3和电脑蓝牙配对。
IMG_138.jpg (51.73 KB, 下载次数: 0)
22:45 上传
& & 第三步,配对OK后,电脑应该会自动生成一个COM口
图片20.jpg (35.9 KB, 下载次数: 0)
22:45 上传
& & 第四步,在EV3上简单写一个测试程序,大致如下
图片8.jpg (30.67 KB, 下载次数: 0)
22:45 上传
图片9.jpg (25.56 KB, 下载次数: 0)
22:45 上传
图片10.jpg (41.77 KB, 下载次数: 0)
22:45 上传
图片11.jpg (29.42 KB, 下载次数: 0)
22:45 上传
& & 程序一共由4个独立循环组成,”a” mailbox 负责接收数值并显示,”b”mailbox负责接收字符串并显示,”c”mailbox负责接收逻辑并通过红绿灯显示,”d”mailbox负责发送一个字符串“HI”到“QH-...”, “QH-...”为电脑的名称,请根据实际情况填写。
& & 第四步,打开串口调试软件,选择COM口并点击打开,如果顺利,在EV3这边能看到蓝牙符号变成
图片12.jpg (1.82 KB, 下载次数: 0)
22:45 上传
& & 第五步,开打EV3上编写好的程序,同时把串口调试软件设置成16进制接收和发送,然后就可以开始发送一些数据来看看EV3的反映:例如,
& & 发送数值100到”a”mailbox的包如下0d 00 00 00 81 9e 02 61 00 04 00 00 00 c8 42
f.JPG (30.67 KB, 下载次数: 0)
22:45 上传
IMG_149.jpg (43.78 KB, 下载次数: 0)
22:45 上传
& & 发送字符串”abc” 到”b”mailbox的包如下0d 00 00 00 81 9e 02 62 00 04 00 61 62 63 00
IMG_238.jpg (42.08 KB, 下载次数: 0)
22:45 上传
& & 发送字符串逻辑真 到”c”mailbox的包如下0a 00 00 00 81 9e 02 63 00 01 00 01
IMG_310.jpg (51.83 KB, 下载次数: 0)
22:45 上传
& & 当按下中间按键后,可以看到串口调试软件接收到如下的数据,通过分析正是我们程序中设定的向”d”mailbox 发送字符串 “HI”。
s.JPG (31.97 KB, 下载次数: 0)
22:45 上传
&&大家可以再根据之前贴子里提到的规则,修改相应位置的数据看看效果,至于之前提到的如何把一个数值转转换成4个字节的数据的方法,可参考小弟用C语言写的一个小程序,源码和EXE都在附件中,原理就是通过union的数据类型来转换。
图片13.jpg (24.3 KB, 下载次数: 0)
22:45 上传
& & 大家在了解了和EV3蓝牙通信的原理后,想按照自己的需要来开发自己的程序,唯一的阻碍就是如何在诸如手机或电脑这样的平台上使用蓝牙了,虽然也不是一件容易的事情,但是我相信这方面的教程在百度应该是一抓一大把的。
& & OK,我和大家分享的东西就是这些,第一次写资料贴,可能有些介绍不是很清楚,如果大家还有什么不明白的,可以回帖提问,我尽量保证都回答到。
(17.84 KB, 下载次数: 70)
22:48 上传
点击文件名下载附件
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
搬来 板凳 坐下 听讲& & 向大师学习& &
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
向大师学习
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
研究介绍推广,这个必须顶!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
第二天到了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
楼主写的很详细,蓝牙邮箱功能其实对教育版更有意义,家庭版有红外遥控,教育却只能用颜色传感器来代替了,不能算遥控。而用手机蓝牙遥控方便得多,有些安卓蓝牙串口APP有自定义按键功能,可以定义些常用按键,这样不用手机APP编程,也能在ev3程序使用遥控功能了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
能研究的人很多,但认识记录实验过程,并整理成文字的人就少了。能像楼主一样整理排版后,并共享的人,就是好样的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
stc下载器,楼主现在可以用stc通过蓝牙和ev3通讯了吗?我也想搞,没头绪
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
学习了,真的很不错,日后有需要再来看看
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
牛人的无私奉献
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
Powered by
Template By在使用设备访问中的ble功能的时候,ble.connect()方法的回调已经是true了,可是我这个时候为什么调用ble.writeValueForCharacteristic()来发送数据的时候却一直显示status:false呢? 是因为我的serviceUUID和characteristicUUID没填的缘故吗?要是没填,我应该怎么获取这两个参数呢?(安卓和ios都要使用)
本帖最后由 模块咨询-Turbo 于
15:35 编辑
1,上传下你的代码?猜测是你代码的问题
2,你没传serviceUUID和characteristicUUID?!!!那当然不行(文档上没说明是可选项的参数都是必传项),可以在文档上查错误码提示。
3,通过discover***获取
像这种蓝牙模块都是需要跟蓝牙设备一起调试的,你得先从蓝牙设备厂商了解下,这个蓝牙设备有哪些服务个特征或描述符,哪个特征是写数据的,哪个特征是读数据的,哪个特征是可以setNotify的,如果这些问题都没弄清楚就开始用这个模块了当然会很难。建议先了解下蓝牙4.0收发数据的基本原理,可以看下ble模块接口文档的概述部分。
UID:337213
同求,支持楼主
UID:289544
这个模块 为什么我真机同步&&会报错 怎么解决&&楼主
这个模块 为什么我真机同步&&会报错 怎么解决&&楼主
会报什么错?
这个模块 为什么我真机同步&&会报错 怎么解决&&楼主
报什么错?
ble这个模块不在官方loader里,得云编译或者自定义loader,祝你好运!
var ble = api.require('ble');
ble.getPeripheral( function( ret ){
& & if( ret ){
& && &&&api.alert( {msg:JSON.stringify( ret )} );
});&&开了好几个 蓝牙设备 为什么 搜索出来的 都是空的
var ble = api.require('ble');
ble.getPeripheral( function( ret ){
& & if( ret ){
& && &&&api.alert( {msg:JSON.stringify( ret )} );
});&&开了好几个 蓝牙设备 为什么 搜索出来的 都是空的
var ble = api.require('ble');
ble.getPeripheral( function( ret ){
& & if( ret ){
scan方法的回调函数中是true吗?
1,上传下你的代码?猜测是你代码的问题
2,你没传serviceUUID和characteristicUUID?!!!那当然不行(文 ...
ble.scan({
& & serviceUUIDs:[]
}, function( ret ){
& & if( ret.status ){
& && &&&getPeripheral();
ble.writeValueForCharacteristic({
& & peripheralUUID: uuid,
& & value:'FDFDFA050D0A'
},function(ret){
& & if(ret) {
& && &&&alert('fuck');
& && &&&api.alert( {msg:JSON.stringify( ret )} );
另外&&我用discoverService能查询出来UUID,但是用discoverCharacteristics就获取不了信息,我是连接血压计用的,老版本的android和ios用的uuid和这个里面用的是一样的。但是这里面不行。
peripheralUUID在getPeripheral里面获取对吧,这个能够正常得到。
serviceUUID和characteristicUUID到底应该怎么样获取呢?discoverService获取的是serviceUUID吗?如果是的,那这个UUID已经得到了。可是characteristicUUID应该怎么获取????
(C) 2014 APICloud单片机通过SPP-C蓝牙模块发送数据给手机,数据不正确-电子产品世界论坛
单片机通过SPP-C蓝牙模块发送数据给手机,数据不正确
1.用手机可以与蓝牙配对成功,蓝牙能正确识别手机输入的密码,应该能说明手机和蓝牙模块通讯的正常吧。
2.用单片机可以修改蓝牙模块的名称、波特率,应该能说明单片机与蓝牙模块通讯的正确吧。
但是单片机通过蓝牙模块发到手机的字符串,手机显示的就不正确,无论是asci码还是16进制都不对,i有人遇到过这样的问题吗?请给个指点。
发送和接收到的数据贴出来
看看什么情况
感觉楼主使用了ascII当是16进制数据了。
后来发现是单片机串口的数据位数不对,配置的9位数据。
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有查看: 1230|回复: 3
串口接蓝牙无法发送数据问题
为了调试的方便,我决定用蓝牙来进行数据的收发。但是出现了单片机串口发送数据给蓝牙芯片无法接收的问题,于是我做了如下实验:一开始,我认为蓝牙有问题,所以我用了两个串口模块,接在电脑上,让两个蓝牙模块互发数据,收发正常,蓝牙没有问题。然后,我又把单片机直接通过串口模块连接电脑,串口调试助手可以接收到单片机发来的数据,程序没有问题。最后,我用51单片机写了一个简单的串口发送程序,接上蓝牙,上位机可以收到51发来的串口数据。山外哥,真的不知道该如何解决这个问题,是不是电平信号太低了,要加一个放大电路啊?
需要问问蓝牙模块的卖家,他们技术参数如何
波特率,发送的串口函数对不对
你uart的通道选对了么?我亲测基本所有的蓝牙模块用k60的通信都可以的,知识k60的通道比较多,容易接错线,你查一下是不是通道选错了
山外飞思卡尔智能车论坛查看: 1196|回复: 4
用蓝牙从机模块HC-06能做到将传感器采集到的数据发送给手机吗?
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间0 小时
本人渣渣,求指导
主题帖子精华
金钱118214
在线时间920 小时
可以啊,写代码就好
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
高级会员, 积分 743, 距离下一级还需 257 积分
在线时间155 小时
回复【2楼】正点原子:
---------------------------------
有类似的程序吗?基础不太好,怎么编程序给蓝牙让他把数据实时传给手机啊
主题帖子精华
金牌会员, 积分 1123, 距离下一级还需 1877 积分
在线时间222 小时
回复【3楼】炫色康康:
---------------------------------
是蓝牙4.0吗
我发的帖子有,不是也差不多的
nrf51822蓝牙4.0手环开发板:
主题帖子精华
高级会员, 积分 743, 距离下一级还需 257 积分
在线时间155 小时
回复【4楼】muniao:
---------------------------------
hc-06的,可以给一下链接吗,话说蓝牙现在可以被搜到,就是不知道怎么把数据传到手机上,是通过什么程序实现的?
Powered by}

我要回帖

更多关于 蓝牙模块发送at 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信