蓝牙 BLE连接参数 连接间隔讲解 connection interval Slave latency timeout CH573 CH582 CH579 peripheral通用外设例子讲解四
// Minimum connection interval (units of 1.25ms, 6=7.5ms) #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 6 //最小连接间隔 // Maximum connection interval (units of 1.25ms, 100=125ms) #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 100 //最大连接间隔
// Slave latency to use parameter update
#define DEFAULT_DESIRED_SLAVE_LATENCY 0 //可忽略连接间隔的次数,默认是不忽略
// Supervision timeout value (units of 10ms, 100=1s)
#define DEFAULT_DESIRED_CONN_TIMEOUT 100 //连接超时时间,连接 IOS 时此参数必须小于 6S
1、连接间隔
DEFAULT_DESIRED_MIN_CONN_INTERVAL(最小连接间隔)和
DEFAULT_DESIRED_MAX_CONN_INTERVAL(最大连接间隔)
这个间隔 是指成功连接后 的周期性通讯时间,主机会根据使用情况 在 这个取值范围内 选择合适的 间隔时间,这个具体值是不可控的,所以需要划定一个范围使得通讯响应在自己的可控范围之内。这个具体值会影响到下一次通讯数据包的响应时间,需要根据自己的情况来调整这个范围达到 既省电又匹配程序响应速度 的目的。
比如:
大数据传递时:通讯数据包是连续传递的,主机会选择min值来进行通讯。
无数据传递时:通讯是空闲状态,主机会选择max值来定期询问从机状态,以保持连接不中断。(在空闲时,由于使用max的值作为通讯周期,会影响到程序的下一个命令的发送时间)
( 连接间隔以1.25ms为单位;连接间隔的范围是6~3200,即7.5ms~4s之间)
2.Slave Latency(从设备延迟或者从设备时延)
允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件,在这些连接事件中不必回复Master(主设备)的包,这样就能更加省电(范围可以是0~499)。
上图,Slave Latency = OFF时,master发包,slave必须回复,如果不回复,Master就会认为slave那边接收不正常。若Slave Latency = ON时, master 发包,slave允许有3个包不回复
注意:这个参数更重要的应用 :比如在距离远或者干扰大的时候 无数据通信的时候。把这个值设大可以减少掉线概率。
比如防丢器:放在口袋里面假如这个参数设置为0 表示规定时间内必须响应从机,不然就以为是蓝牙断开了。假如设置为5。假如信号不好的时候,即使中间丢了4个,只接受了1个就表示连接了。因为他会跳过其中4个 ,保证了不掉线的概率
3.Supervision Timeout(超时时间或者监控超时)
这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开(单位是10ms,范围是10~3200即100ms~32s)。
连接间隔、从机时延以及超时时间这三者必须满足如下公式:
Supervision Timeout >(1 +slaveLatency)*(connectionInterval)
注:slaveLatency不能算在 supervision Timeout的时间内,否则连接就会不正常断开
这三个连接参数在不同情况下对通信速率和功耗的影响
1.Connection Interval缩短,Master和Slave通信更加频繁,提高了数据吞吐速度,缩短了数据发送时间,但也提高了功耗。
2.Connection Interval加长,通信频率降低,数据吞吐速度降低,数据发送等待的时间更长,但这种设置降低了功耗。
3.Slave Latency减少或者设置为0,那么每次连接事件中都需要回复Master的包,当然功耗会上升,但数据发送速度也会提高。
4.Slave Latency加长,功耗下降,数据发送速度降低。
参数协商 启动协商任务
// Set timer for param update event tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, SBP_PARAM_UPDATE_DELAY);
执行参数协商任务
if(events & SBP_PARAM_UPDATE_EVT) { // Send connect param update request GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle, DEFAULT_DESIRED_MIN_CONN_INTERVAL, DEFAULT_DESIRED_MAX_CONN_INTERVAL, DEFAULT_DESIRED_SLAVE_LATENCY, DEFAULT_DESIRED_CONN_TIMEOUT, Peripheral_TaskID); return (events ^ SBP_PARAM_UPDATE_EVT); }
进回调函数,打印协调的参数结果
static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, uint16_t connSlaveLatency, uint16_t connTimeout) { if(connHandle == peripheralConnList.connHandle) { peripheralConnList.connInterval = connInterval; peripheralConnList.connSlaveLatency = connSlaveLatency; peripheralConnList.connTimeout = connTimeout; PRINT("Update %x - Int %x \n", connHandle, connInterval); } else { PRINT("ERR..\n"); } }