两个CH582M蓝牙通信,通信总是会断开(距离很近也断开)

一个CH582M作为主机,另一个CH582M作为从机。主机上电后主动连接从机,可以连接成功,连接成功后主机每隔50ms向从机写一条数据,从机接收到数据后把处理的结果以通知的形式返回给主机。测试的时候,经常会出现连接断开,或者主机打印Write Err:1。请问,该怎么处理?

                req.pValue[0] = 0x3E;

                req.pValue[1] = 0x00;

                req.pValue[2] = 0x00;

                req.pValue[3] = 0x10;

                req.pValue[4] = 0x0C;


                bStatus_t status = 0;

                status = GATT_WriteCharValue(centralConnHandle, &req, centralTaskId);

                if(status == SUCCESS)

                {

                    centralProcedureInProgress = TRUE;

                    tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

                }

                else

                {

                    PRINT("Write Fail:%d\n",status);

                    GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);

                    tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);

                }


这里的PRINT打印的status值是 22.


[17:41:31.218]收←◆Write Fail:22


[17:42:14.987]收←◆Device found...

Connecting...


[17:42:15.068]收←◆Connected...


[17:42:15.141]收←◆exchange mtu:247


[17:42:15.254]收←◆Bonding success


[17:42:15.302]收←◆MTU: f7


[17:42:16.099]收←◆Found Profile Service handle : 21 ~ ffff 


[17:42:16.164]收←◆Found Characteristic 6 handle : 32 


[17:42:16.230]收←◆Found client characteristic configuration handle : 33 


这是主机复位后开始连接从机的打印情况


我做了进一步的测试:主机不向从机写数据,从机定时50ms给主机发送通知,这种情况下,不会出现断开也不会出现其他异常。


蓝牙通讯是根据握手的连接间隔进行包交互的,不是用户怎么传就怎么传数据包的

            if(centralDoWrite)
            {
                // Do a write
                attWriteReq_t req;

                req.cmd = FALSE;
                req.sig = FALSE;
                req.handle = centralCharHdl;
                req.len = 1;
                req.pValue = GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0);
                if(req.pValue != NULL)
                {
                    *req.pValue = centralCharVal;

                    if(GATT_WriteCharValue(centralConnHandle, &req, centralTaskId) == SUCCESS)
                    {
                        centralProcedureInProgress = TRUE;
                        centralDoWrite = !centralDoWrite;
                        tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
                    }
                    else
                    {
                        GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
                    }
                }
            }

虽然定时调用发送任务,但是如果返回失败,证明底层缓存还有包没有发出去,没有足够的空间来传当前这一包数据。
需要用户自己做缓存处理,也不要在发送的地方死等发送成功,而是继续轮询,等下次可以发送。



我现在的需求是主机发送数据,从机回应数据,这样一个通信周期必须在50ms内完成。应该怎么改程序?

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


蓝牙的主机和从机的这个参数我已经改成上面的数据了。


image.png
这个值*1.25ms就是连接间隔,默认一个连接间隔最多发一包数据,默认短包19字节。

peripheral例子默认都是1字节收发。
CH573 CH582 CH579 peripheral通用外设例子讲解一 - debugdabiaoge - 博客园 (cnblogs.com)

蓝牙 BLE连接参数 连接间隔讲解 connection interval Slave latency timeout CH573 CH582 CH579 peripheral通用外设例子讲解四 - debugdabiaoge - 博客园 (cnblogs.com)


你提到的连接间隔之类的参数我是理解的,并且做了修改,并且协商的结果是0x0C,也就是我设置的最大值12.现在的现象是两个CH582M模块距离很近的时候,通信是正常的。但距离稍微远一点(大于10cm),通信就失败。我也考虑过可能是天线的问题,但是从咱的数据手册上得知,咱的发射功率可以达到6dBm。我已经把发射功率调节到最大了,通信距离还是稍远一点就会断开。


留个邮箱,发个可以用的例程给你,或者发送邮件至hy@wch.cn获取。


个人信息保护,已隐藏


已发送,请查收。


谢谢!已经收到了,初步测试了以下,基本满足需求。我再详细测试一下,有什么疑问随时反馈


我也遇到相同的问题,连接上后,主机发送一段时间数据,突然就发送不成功了,返回的错误码也是22,后面变成23了。请问怎么才能自由发送数据?


邮件已发送新的库文件,替换库文件看看呢,请查收。


也发我一份程序 邮箱:个人信息保护,已隐藏



可以下载最新的582EVT例程,库已经更新,解决了此类问题。

/downloads/CH583EVT_ZIP.html


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