蓝牙4.0广泛应用于可穿戴设备、智能控制系统、智能家居等领域。我们在使用过程中难免遇到不同的问题。本帖以深圳市馒头科技有限公司的MT-BLE系列蓝牙4.0模块为例,将蓝牙4.0模块各种使用情景写给各位需要应用到蓝牙4.0的技术人员。
第一节 MTSerialBle简介 第二节 通信演示 第三节 IO口操作 第四节 常用指令 第五节 串口指令 第六节 主机指令 |
蓝牙4.0模块开发指南
1.1.1 使用智能手机和电器设备通讯
通过MTSerialBle的透传功能,可以建立起智能手机和普通设备的连接桥梁,相当于手机端直接和设备的串口建立起了连接。
1.1.2 智能灯控
通过MTSerialBle的IO控制功能,可以省去外挂的MCU,直接通过PWM和IO控制多彩LED的亮度和颜色。
1.1.3 取代电缆线
通过MTSerialBle的主从一体功能,将两个模块分别设置为主从模块,就可实现模块之间的相互通信,此功能可以用于一些使用电缆通信的场景,使用BLE取代通信电缆。
1.1.4 智能门锁
通过MTSerialBle的IO控制功能,可以省去外挂的MCU,直接通过PWM和IO控制外围电路,实现智能门锁。
1.1 手机和模块
手机与模块之间传输数据,我们将模块的串口通过USB转串口接入到PC,通过PC端的串口助手完成数据的收发。这里需要注意,手机必须支持蓝牙4.0功能才能和模块通讯。
1.1.1 连接模块到电脑
1.1.2 设置为从机
1.1.3 数据收发
1.1.4 Android系统
Android系统可以使用我们公司开发的BLE调试工具(MTBleTools)进行操作,可以通过应用市场或百度网盘下载此工具。
1.1.5 IOS系统
直接在苹果商店里面搜索MTBLE 即可搜索到。下载安装。
操作方法与安卓基本一样。
模块和模块传输数据,必须保证两个模块都是MTSerialBle透传模块,分别工作在主从模式,并且用户自定义数据一致。
以下我们使用两个MT254xCoreSTest演示模块之间互相透传数据。
1.2.1 连接模块到电脑
1.2.2 分别设置为主从
1.2.3 互发数据
为了保持我们在之前51单片机、STM32对I/O口控制的习惯性,MT-BLE蓝牙4.0模块的AT指令操作I/O口仍然保留这个操作写法。
如上图所示:
1. GND、VCC不解释,DC、DD:烧写引脚;
2. PIO0、PIO1、PIO2、PIO3、PIO4、PIO5、PIO6,这7个引脚为I/O口高低电平输出与读取;
3. PWM0、PWM1、PWM2、PWM3,这4个引脚为4路PWM输出;
4. ADC,这个引脚为AD采样;
1.1 查询/设置——LED提示方式
指令 |
应答 |
参数 |
查询:AT+LED? |
OK+LED: Para |
Para:S,N S:待机慢闪,连接后常亮 N:待机暗,连接后亮 亮—低电平 暗—高电平 默认Para =S |
设置:AT+LED[Para] |
OK+LED: Para |
提示:可以通过此引脚判断设备是否处于连接状态
示例:
Send: AT+LED? // 查询当前LED提示方式
Recv: OK+LED:S // 当前为 待机慢闪,连接后常亮
Send: AT+LED[N] // 设置LED提示方式为待机暗,连接后亮
Recv: OK+LED:N // 设置成功
指令 |
应答 |
参数 |
查询:AT+PIO[Para1]? |
OK+PIO: Para1#Para2 |
Para1: IO 编号:0---6 Para2: IO电平 0或1 |
设置:AT+PIO[Para1,Para2] |
OK+PIO: Para1#Para2 |
注意:当设置IO电平时,IO自动切换为上拉输出模式。当查询IO电平时,IO自动切换为上拉输入模式。
示例:
Send: AT+PIO[0]? // 查询PIO0的电平
Recv: OK+PIO:0#1 // 当前PIO0的电平为高
Send: AT+PIO[1][0] // 设置PIO1输出低电平
Recv: OK+PIO:1#0 // 电平设置成功
这个用途,我们可以通过蓝牙控制电平驱动电路。
指令 |
应答 |
参数 |
查询:AT+MPIO[Para1]? |
OK+MPIO: Para1#Para2 |
Para1: 多个IO的集合 0x00--------0x7F 每一位对应一个IO Para2:IO对应的电平 0x00--------0x7F 每一位对应一个IO的电平 |
设置:AT+MPIO[Para1,Para2] |
OK+MPIO: Para1#Para2 |
注意:当设置IO电平时,IO自动切换为上拉输出模式。当查询IO电平时,IO自动切换为上拉输入模式。
示例:
Send: AT+MPIO[0F]? // 查询PIO0、PIO1、PIO2、PIO3的状态
Recv: OK+MPIO:0F#0A // PIO0到PIO3的电平分别为 低、高、低、高
Send: AT+MPIO[70,AA] // 设置PIO4到PIO6分别输出 低、高、低
Recv: OK+MPIO:70#20 // 设置成功 注意这里
指令 |
应答 |
参数 |
查询:AT+PWM[Para1]? |
OK+PWM: Para1#Para2#Para3 |
Para1: PWM编号: 0---3 Para2: PWM输出频率 100-10000Hz 0:停止PWM Para3: PWM占空比 1---100 0:停止PWM |
设置: AT+PWM[Para1,Para2,Para3] |
OK+PWM: Para1#Para2#Para3 |
注意:4路PWM输出的频率无法单独设置,必须是一样的,当前输出的频率为最后设置的频率。
示例:
Send: AT+PWM[1]? // 查询PWM1的当前设置
Recv: OK+PWM:1#1000#50 // PWM1的当前设置为1000Hz,占空比50%
Send: AT+PWM[2,1500,20] // 设置PWM2为输出频率为:1500Hz 占空比:20%
Recv: OK+PWM:2#1500#20 // 设置成功
指令 |
应答 |
参数 |
查询:AT+EPIO? |
OK+EPIO: Para |
Para: 多个IO的集合 0x00-----0x7E 每一位对应一个IO 默认值:00 |
设置:AT+EPIO[Para] |
OK+EPIO: Para |
注意:PIO0没有主动上报功能; 设置主动上报功能后,相应IO自动切换为输入模式。
使用建议:常态为高电平,触发时为低电平。
使能IO主动上报功能后,当对应IO电平发生变化时,与之连接的设备将会接收到相应的提示
Recv: OK+MPIO:7E#3E // PIO6当前电平低,PIO1~PIO5为高
Recv: OK+MPIO:70#70 // PIO4~PIO6为高
Recv: OK+MPIO:0E#03 // PIO1~PIO2为高,PIO3为低
示例:
Send: AT+EPIO? //查询当前IO主动上报功能
Recv: OK+EPIO:10 // 当前PIO4开启了主动上报功能
Send: AT+EPIO[7E] // 设置PIO1~PIO6都开启主动上报功能
Recv: OK+EPIO:7E // 设置成功
指令 |
应答 |
参数 |
查询:AT+ADC? |
OK+ADC: Para |
Para: ADC电压值 0-1250mV |
注意:由于adc采样内部基准源,所以采集电压的范围为0-1250mV。
示例:
Send: AT+ADC? // 查询ADC当前电压值
Recv: OK+ADC:100 // ADC当前为100mV
1.1 测试
指令 |
应答 |
参数 |
AT+ |
OK+ |
无 |
示例:
Send: AT+ //测试指令
Recv: OK+ //指令测试成功
1.2 固件版本查询
指令 |
应答 |
参数 |
查询:AT+VERS? |
OK+版本信息 |
无 |
示例:
Send: AT+VERS? //查询固件版本
Recv: OK+MTSeriBleV220 //当前固件版本为V220
1.3 查询/设置——设备名
指令 |
应答 |
参数 |
查询:AT+NAME? |
OK+NAME: Para |
Para:模块名称 最长允许11个字符,包括字母、数字、下划线。 默认Para=MTSeriBlexx |
设置:AT+NAME[Para] |
OK+NAME: Para |
示例:
Send: AT+NAME? //查询当前设备名
Recv: OK+NAME:MTSeriBle12 // 当前设备名为:MTSeriBle12
Send: AT+NAME[Serial] //设置设备名为Serial
Recv:OK+NAME:Serial //设备名成功设置为Serial
1.4 恢复出厂设置
指令 |
应答 |
参数 |
AT+RENEW |
OK+RENEW |
无(此指令会使模块重启) |
示例:
Send: AT+RENEW //恢复出厂设置
Recv: OK+RENEW //模块即将重启
1.5 重启模块
指令 |
应答 |
参数 |
AT+RESET |
OK+RESET |
无(此指令会使模块重启) |
示例:
Send: AT+RESET //重启模块
Recv: OK+RESET //模块即将重启
1.6 查询——当前工作状态
指令 |
应答 |
参数 |
查询:AT+STAS? |
OK+STAS: Para |
Para:A~E A:空闲 B:广播 C:扫描 D:连接建立 E:连接断开 |
示例:
Send: AT+STAS? //查询当前状态
Recv: OK+STAS:B //设备当前正在广播
1.7 查询/设置——状态通知使能
指令 |
应答 |
参数 |
查询:AT+NOTI? |
OK+NOTI: Para |
Para:Y,N Y:使能通知 N:禁止通知 默认Para=Y |
设置:AT+NOTI[Para] |
OK+NOTI: Para |
注意:使能通知后,模块将会主动从串口输出当前的状态。禁止通知后,串口只输出无线端传输的数据以及指令的响应。
示例:
Send: AT+NOTI? // 查询通知是否使能
Recv: OK+NOTI:Y // 当前通知为使能状态
Send: AT+NOTI[N] // 设置通过为禁止
Recv: OK+NOTI:N // 设置成功
1.8 查询/设置——模块工作方式
指令 |
应答 |
参数 |
查询:AT+IMME? |
OK+IMME: Para |
Para:Y,N Y:上电立即自动工作 N:上电等待指令 默认para=Y |
设置:AT+IMME[Para] |
OK+IMME: Para |
注意:上电工作在主从模式下分别对应如下功能
从机模式下:
自动工作为开始广播,如果为手动工作方式,则需要通过指令开启广播。详见4.3。
主机模式下:
开始扫描设备并且尝试连接,如果有成功连接过的设备在信号范围内,则会自动连接此设备。如果为手动工作方式,这需要通过指令进行扫描和连接操作,详见第5章。
示例:
Send: AT+IMME? //查询工作方式
Recv: OK+IMME:Y //当前为上电自动工作方式
Send: AT+IMME[N] //设置为手动工作方式
Recv: OK+IMME:N //设置成功
1.9 查询/设置——主从模式
指令 |
应答 |
参数 |
查询:AT+ROLE? |
OK+ROLE: Para |
Para:C,P C:主机 P:从机 默认para=P |
设置:AT+ROLE[Para] |
OK+ROLE: Para |
注意:设置指令会使模块重启
示例:
Send: AT+ROLE? // 查询当前模式
Recv: OK+ROLE: P //当前为从机模式
Send: AT+ROLE[C] //设置为主机模式
Recv: OK+ROLE:C //设置成功,模块即将重启
1.10 远控指令
指令 |
应答 |
参数 |
AT+R[Para] |
远控指令应答 |
Para:AT指令 |
说明:在指令模式下,此指令可将AT指令发送至远端模块。此指令只适用模块与模块之间,如果为模块与手机之间,可以通过指令服务实现对远端模块的控制,详见《MTSerialBle-App开发指南》。
示例:
Send: AT+R[AT+VERS?] //查询远端模块的固件版本
Recv: OK+MTSeriBleV150 //远端模块的固件版本为150
Send: AT+R[AT+PIO[1,1]] //设置远端模块的PIO1输出高电平
Recv: OK+PIO:1#1 //远端模块的PIO1输出电平为高
由于USB CDC串口参数为自适应,所以串口指令对USB CDC 串口无效,例如USBDongle。
1.1 查询/设置——串口波特率
指令 |
应答 |
参数 |
查询:AT+BAUD? |
OK+BAUD: Para |
Para:A~G A:2400 B:4800 C:9600 D:19200 E:38400 F:57600 G:115200 H:230400 默认para=G |
设置:AT+BAUD[Para] |
OK+BAUD: Para |
注意:USBDongle的串口参数为自适应,所以此指令设置无效。使用USBDongle,当PC端的波特率设置为9600时,USBDongle自动进入指令模式。
示例:
Send: AT+BAUD? // 查询当前波特率
Recv: OK+BAUD:G // 当前波特率为115200
Send: AT+BAUD[C] // 设置串口波特率为9600
Recv: OK+BAUD:C // 设置成功
1.2 查询/设置——串口停止位
指令 |
应答 |
参数 |
查询:AT+STOP? |
OK+STOP: Para |
Para:A~B A:1位停止位 B:2位停止位 默认para=A |
设置:AT+STOP[Para] |
OK+STOP: Para |
示例:
Send: AT+STOP? // 查询串口停止位
Recv: OK+STOP:A // 当前停止位为1位
Send: AT+STOP[B] // 设置停止位为 2位
Recv: OK+STOP:B // 设置成功
1.3 查询/设置——串口发送延时时间
指令 |
应答 |
参数 |
查询:AT+SDLY? |
OK+SDLY: Para |
Para:0~10000(单位:ms) 0:不延时 默认Para =0 |
设置:AT+SDLY[Para] |
OK+SDLY: Para |
注意:串口发送延时——当无线端收到数据后RDY口将会输出低电平,并且开始延时这个时间后开始从串口输出数据,可以利用此功能唤醒外部MCU。
此值建议设置为MCU从唤醒到能够接收数据的时间。
示例:
Send: AT+SDLY? // 查询串口发送延时
Recv: OK+SDLY:1000 // 当前串口发送延时为 1000ms
Send: AT+SDLY[0] // 设置串口发送延时0ms——广播发送延时
Recv: OK+SDLY:0 // 设置成功
主机指令在从机模式下无效。模块工作在主机时,只能与MTSerialBle透传从机连接。
5.1 扫描从机
指令 应答 参数
AT+SCAN OK+SCAN: Para1#Para2…… Para1:扫描到的设备数量
Para2:扫描到的设备地址列表
注意:默认扫描时间为5秒,完成5秒扫描后才有响应。
示例:
Send: AT+SACN // 开始扫描从设备
Recv: OK+SCAN:3#112233445566#223344556677#334455667788 // 扫描到3个从设备
Send: AT+SACN // 开始扫描从设备
Recv: OK+SCAN:0 // 没有扫描到从设备
当开启扫描显示设备名或显示信号强度时,扫描响应将会携带设备名和信号强度,具体响应如下。
1. 开启显示设备名:
Recv: OK+SCAN:2#112233445566@abc#223344556677@bcd // 扫描到2个从设备
设备MAC地址 设备名
设备1 112233445566 abc
设备2 223344556677 bcd
2. 开启显示信号强度:
Recv: OK+SCAN:2#112233445566@-50#223344556677@-63 // 扫描到2个从设备
设备MAC地址 信号强度
设备1 112233445566 -50dBm
设备2 223344556677 -63dBm
3. 同时显示设备名和信号强度
Recv: OK+SCAN:2#112233445566@abc@-50#223344556677@bcd@-63 // 扫描到2个从设备
设备MAC地址 设备名 信号强度
设备1 112233445566 abc -50dBm
设备2 223344556677 bcd -63dBm
5.2 设置/查询——扫描参数
指令 应答 参数
查询:AT+RANG? OK+RANG:Para1#Para2 Para1:持续扫描时间
范围:1~10
单位:秒/S
默认值:5
Para2:扫描信号范围
范围:10~100
单位:dBm
默认值:100
设置:
AT+RANG[Para1,Para2] OK+RANG:Para1#Para2
注意:扫描时间为主设备查找从设备的时间,如果从设备当前在信号范围内广播,一般情况5秒内可以扫描到。扫描信号范围可用户过滤较远的设备,只扫描离主设备近的从设备,此值越小距离越近。
例如我们设置参数为AT+RANG[10,50],则表示持续扫描10秒,并且只扫描信号强度大于-50dBm的设备。
示例:
Send: AT+RANG? // 查询当前扫描参数
Recv: OK+RANG:5#100 // 持续扫描5秒,只扫描信号强度在-100dBm以内的设备
Send: AT+RANG[10,50] // 设置扫描参数为持续扫描10秒,只扫描-50dBm以内的设备
Recv: OK+RANG:10#50 // 设置成功
5.3 连接搜索结果中指定序号的设备
指令 应答 参数
AT+CONN[Para] 连接成功:OK+CONN:Para
连接失败:FAIL+LINK Para:要连接的设备在搜索结果中的索引号
注意:此索引号要小于SCAN指令返回的搜索到的设备数量,编号从0开始。
示例:
Send: AT+CONN[0] // 连接扫描结果中第0个设备
Recv: OK+CONN:0 // 开始连接
如果使能了通知功能,在开启广播时将还会接收到
Recv:WAR+LINK:Y // 连接建立
Recv:FAIL+LINK // 连接失败
5.4 连接指定地址的设备
指令 应答 参数
AT+CON[Para] 连接成功:OK+CON:xxxxxxxx
连接失败:FAIL+LINK Para:要连接的设备MAC地址
注意:蓝牙的MAC地址为6Byte,用字符串表示为12个字符,例如112233445566。
示例:
Send: AT+CON[112233445566] // 连接MAC地址为112233445566的从设备
Recv: OK+CON:112233445566 // 开始连接
如果使能了通知功能,在开启广播时将还会接收到
Recv:WAR+LINK:Y // 连接建立
Recv:FAIL+LINK // 连接失败
5.5 连接最后一次连接成功的设备
指令 应答 参数
AT+CONL 连接成功:OK+CONL
连接失败:FAIL+LINK 无
注意:如果最后一次连接成功的设备当前正在信号范围内广播,则可以直接连接成功,否则连接失败。
示例:
Send: AT+CONL // 连接最后一次连接成功的设备
Recv: OK+CONL // 开始连接
如果使能了通知功能,在开启广播时将还会接收到
Recv:WAR+LINK:Y // 连接建立
Recv:FAIL+LINK // 连接失败
5.6 扫描时是否显示设备名
指令 应答 参数
查询:AT+SNAME? OK+SNAME:Para Para:是否显示设备名
Y:显示
N:不显示
默认para=N
设置:AT+SNAME[Para] OK+SNAME:Para
示例:
Send: AT+SNAME? // 查询扫描时是否显示设备名
Recv: OK+SNAME:N // 扫描时不显示设备名
Send: AT+SNAME[Y] // 设置扫描时显示设备名
Recv: OK+SNAME:Y // 设置成功
5.7 扫描时是否显示信号强度
指令 应答 参数
查询:AT+SRSSI? OK+SRSSI:Para Para:是否显示信号强度
Y:显示
N:不显示
默认para=N
设置:AT+SRSSI[Para] OK+SRSSI:Para
示例:
Send: AT+SRSSI? // 查询扫描时是否显示信号强度
Recv: OK+SRSSI:N // 扫描时不显示信号强度
Send: AT+SRSSI[Y] // 设置扫描时显示信号强度
Recv: OK+SRSSI:Y // 设置成功
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |