一个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
蓝牙的主机和从机的这个参数我已经改成上面的数据了。
这个值*1.25ms就是连接间隔,默认一个连接间隔最多发一包数据,默认短包19字节。
peripheral例子默认都是1字节收发。
CH573 CH582 CH579 peripheral通用外设例子讲解一 - debugdabiaoge - 博客园 (cnblogs.com)
你提到的连接间隔之类的参数我是理解的,并且做了修改,并且协商的结果是0x0C,也就是我设置的最大值12.现在的现象是两个CH582M模块距离很近的时候,通信是正常的。但距离稍微远一点(大于10cm),通信就失败。我也考虑过可能是天线的问题,但是从咱的数据手册上得知,咱的发射功率可以达到6dBm。我已经把发射功率调节到最大了,通信距离还是稍远一点就会断开。
留个邮箱,发个可以用的例程给你,或者发送邮件至hy@wch.cn获取。
个人信息保护,已隐藏
已发送,请查收。
谢谢!已经收到了,初步测试了以下,基本满足需求。我再详细测试一下,有什么疑问随时反馈
我也遇到相同的问题,连接上后,主机发送一段时间数据,突然就发送不成功了,返回的错误码也是22,后面变成23了。请问怎么才能自由发送数据?
邮件已发送新的库文件,替换库文件看看呢,请查收。
也发我一份程序 邮箱:个人信息保护,已隐藏
可以下载最新的582EVT例程,库已经更新,解决了此类问题。