最近因为创客项目需要,所以自己研究了一些蓝牙模块。因为我自己是软件开发出身,对硬件了解得不多,对于蓝牙模块的了解可能更为接近于一个程序员的角度,当然也就不太全面了。但是过程中觉得还是有一些有价值的东西可以分享给大家的,特别是更适合程序员同学们。不专业之处,大家包涵。本文会随着我的知识积累不断成长更新,请给我时间。
Part 1里我讲了一下我拿到的CC41和克隆的HM-10,最后我将克隆的MH-10刷成了“真”HM-10。这一部分我想说一下我理解的蓝牙模块的2种模式。
系列文章列表
一、试用蓝牙模块的一点经验整理(Part 1, 刷HM-10固件)
二、试用蓝牙模块的一点经验整理(Part 2, 蓝牙模块AT指令 )
三、试用蓝牙模块的一点经验整理(Part 3, 关于Beacon功能 )
下载资源
🚀 关于HM-10的其它相关资料,比如产品手册等,可以在这里😆下载。
🚀 CC41的相关资料,可以在这里😆下载。
二、蓝牙模块的AT指令和透传
关于工作模式
我在使用蓝牙模块的过程中,知道蓝牙模块会有两种工作模式。
- 一种是AT模式,这时我们可以给模块发AT指令,从而可以查询模块的参数或者对模块进行设置。
- 另一种状态是透传模式,就是当蓝牙模块连接上之后,我们可以直接发送数据给蓝牙模块,而蓝牙模块不管我们发的是什么,都直接传给对方。(这时发AT命令是无效的。)
在买蓝牙模块之前呢,我以为所有的模块的AT指令都一样的。但其实是我太天真的,最终我看到的是有几种格式,不同型号似乎AT命令不一样。具体原因是什么,哪位大佬可以科普一下?
比如:
- CC41的AT指令是这样的:
- 指令不分大小写;
- 指令最后要跟上换行也就是“\r\n”(忘记加上会没有反应);
- 设置参数直接跟在指令后面,如at+role1,就是将模块设置为主机。
- HM-10的AT指令是这样的:
- 指令全都要大写;
- 指令最后不要跟上换行“\r\n”(有换行的话模块会没有反应);
- 查询类语句后面要加上“?”,如AT+ROLE?是查询当前模块是主机(Master)还是从机(Slave);
- 设置参数直接跟在指令后面,如AT+ROLE1,就是将模块设置为主机。
- HC-08的AT指令是这样的:
- 指令全都要大写;
- 指令最后不要跟上换行“\r\n”(有换行的话模块会没有反应);
- 查询类语句后面要加上“=?”,如AT+ROLE=?是查询当前模块是主机(Master)还是从机(Slave);
- 设置参数在指令后面要加上“=”,如AT+ROLE=M,就是将模块设置为主机。
- HC-05的AT指令则是基本跟HM-10一样,问题是要求跟上换行“\r\n”。
为什么这样设计?目前我也不太清楚。但大家用的时候如果不是熟悉的模块的话,记得向卖家要文档以查看AT指令说明。
❗切记,不要想当然,相同的指令在不同模块的功能是不一样的。比如在HM-10的AT+DISC表示扫描,而在HC-05则是表示断开连接。🤣
一些经验记录
对于刚接触的同学,我自己有几个关于AT指令的总结,也许你也用得上:
- "AT"(就这两个字符)这个指令是通用的,接上模块后想确认是否正常工作,就发这个指令过去,如果会返回OK,就表示通了。工作模式、接线、波特率、有无换行等都是正确的。
- 扫描,HM-10、CC41、HC-05都有搜索功能,这是比较重要的功能。我们可以根据扫描结果,然后匹配模块名称(我们可以为模块定义字称的)来决定连接哪一个。
- 连接,连接的方式有两种,
✔ 一种是扫描之后,通过连接指令告诉模块连接刚才扫描结果中的第几个设备。
✔ 一种就是我们已知对方模块的MAC地址,直接指令带上地址来连接。- 断开连接的指令,目前我只发现HM-10模块和HC-05是可以通过发指令断开已经建立的连接。
✔ HM-10就是在连接之后再发“AT”指令,连接就会自动断开。
✔ HC-05则是用“AT+DISC”。
这个功能我自己觉得很重要,毕竟有机会是需要给不同设备发信息的。这也是为什么我买了CC41后要再买HM-10的原因。- HM-10模块的3种工作模式,HM-10模块功能非常强大,它的几个管脚是PIO,可以用于输出或采集。所以为了设置它的PIO的工作状态,有一个指令是AT+MODE。
- AT+MODE0: 透传模式(这是默认值,还记得上一部分中刷完模块要发AT+MODE1吗?因为默认值下它对AT指令没有反应。)
✔ 就是不会接收AT指令,直接将收到的内容转发。- AT+MODE1: PIO 采集+远控+透传
✔ PIO2~3这两个管脚为输出;
✔ PIO4~11这8个管脚为输入;(采集数据,具体采集什么数据,请自行查看HM-10的说明书)
✔ 接收AT指令;
✔ 非“AT”开头的字符串直接转发。- AT+MODE2:透传+远控模式
✔ PIO2~11这两个管脚为输出;
✔ 接收AT指令;
✔ 非“AT”开头的字符串直接转发。