蓝牙总是会断开

用CC2640和CH582M通过蓝牙通信,蓝牙总是断开。串口提示如下:

[11:30:04.316]收←◆Advertising..


[11:30:05.790]收←◆Conn 1 - Int 50 

Connected..


[11:30:06.077]收←◆Pairing started:0


[11:30:06.589]收←◆Update 1 - Int a 


[11:30:07.216]收←◆Pairing success

Bond save success

隔一段时间后,串口就会打印上面的信息。

我想知道蓝牙断开的原因是什么?怎么获取蓝牙断开的原因?

#define SBP_PERIODIC_EVT_PERIOD              1600


// How often to perform read rssi event

#define SBP_READ_RSSI_EVT_PERIOD             6400


// Parameter update delay

//#define SBP_PARAM_UPDATE_DELAY               100

#define SBP_PARAM_UPDATE_DELAY               0


// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)

#define DEFAULT_ADVERTISING_INTERVAL         160


// Limited discoverable mode advertises for 30.72s, and then stops

// General discoverable mode advertises indefinitely

#define DEFAULT_DISCOVERABLE_MODE            GAP_ADTYPE_FLAGS_GENERAL


// Minimum connection interval (units of 1.25ms, 6=7.5ms)

//#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    6

#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    10


// Maximum connection interval (units of 1.25ms, 100=125ms)

//#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    100

#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    10


// 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         10



断连的状态打印发一下看看


怎么打印断连的状态?断开后就直接打印  

[11:30:04.316]收←◆Advertising..

了?


现在测试发现:当CC2640和CH582M通过蓝牙连接成功后,如果双方不发送数据,不会产生蓝牙断开。主从通信过程是这样的:CC2640向CH582M的0xFFF6特征写数据,CH582M收到数据后再调用GATT_Notification这个函数发送出去。测试的时候发现有的时候GATT_Notification这个函数的返回值是0x16。请问一下,我接下来该怎么查找问题产生的原因?


// Minimum connection interval (units of 1.25ms, 6=7.5ms)

#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    6

//#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    10


// Maximum connection interval (units of 1.25ms, 100=125ms)

//#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    100

//#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    10

#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    6

我把上述值由10改为6.

同时把config.h文件中的下面两个值做了更改:

#ifndef BLE_BUFF_MAX_LEN

#define BLE_BUFF_MAX_LEN                    251

#endif

#ifndef BLE_BUFF_NUM

#define BLE_BUFF_NUM                        10

#endif

更改后,不再出现GATT_Notification这个函数的返回值错误的情况。但是还是会断开连接


跟连接参数没什么关闭,EVT里面的程序,没有通道属性是0xFFF6.
0x16 是pending,发送失败,要么是handle值不对,要么是没有响应的通道。
假如用peripheral的例子
image.png

这个地方会打印断开原因。
虽然描述的有点乱,但是大概能猜出来你这个主机没有枚举从机复位,handle错了。

CH579 CH573 CH582 Central 例子应用说明二 (读写通知的控制说明) - debugdabiaoge - 博客园 (cnblogs.com)


不好意思,这句PRINT函数被我屏蔽了。打开后,打印的数据如下:


[14:07:28.284]收←◆Disconnected.. Reason:8

不知道这个8代表的是什么意思?


8是通讯超时,一般要么是本身板子信号不太好,可以用EVT板测试;
如果板子没问题,一般都是代码阻塞,比如现在任务都是在Tmos里面的,如果单个任务执行时间太久,或者代码里面加了长延时,导致超时断开。


好的。我好好检查一下程序代码,看是否有长延时的地方。我想请问一下,为什么主机不发送数据的时候不会产生这个问题呢?


还有就是,手机作为主机的时候,也不会出现这个问题。手机也是一直在向从机发送数据


EVT里面的程序,没有通道属性是0xFFF6.
0x16 是pending,发送失败,要么是handle值不对,要么是没有相应的通道。
假如用peripheral的例子

// Simple Profile Service UUID
#define SIMPLEPROFILE_SERV_UUID     0xFFE0

// Key Pressed UUID
#define SIMPLEPROFILE_CHAR1_UUID    0xFFE1
#define SIMPLEPROFILE_CHAR2_UUID    0xFFE2
#define SIMPLEPROFILE_CHAR3_UUID    0xFFE3
#define SIMPLEPROFILE_CHAR4_UUID    0xFFE4
#define SIMPLEPROFILE_CHAR5_UUID    0xFFE5



嗯嗯,是的。我把这里做了修改。改成0XFFF0了。现在不再出现返回值是0x16的情况了。只是还有断开连接的情况。我仔细检查了以下我的程序,程序中没有长延时,只是简单的读取了2个IO的数据。


现在比较奇怪的现象是:手机和CH582M通信,不会出现连接断开的现象。


老师,麻烦您帮我看看我还由需要注意的地方没?我这边也让硬件工程师测试一下蓝牙信号的问题


只有登录才能回复,可以选择微信账号登录