CH573MultiCentral和Perrpheral接收数据不正常

首先从机和主机的gattprofile.h文件中的 SIMPLEPROFILE_CHAR1_LEN均改为了5,但接受时只有第一个数据正确,请大佬指教!谢谢!!!

发送函数:

uint8 BLE_Send_Txt[5]={10,15,32,86,65};
static uint16 connect0_ProcessEvent( uint8 task_id, uint16 events )
{
if ( events & START_READ_OR_WRITE_EVT )
{   
if( centralConnList[CONNECT0_ITEM].procedureInProgress == FALSE )
{
if( centralDoWrite )
{
// Do a write
  attPrepareWriteReq_t req;
req.handle = centralConnList[CONNECT0_ITEM].charHdl;
req.len = SIMPLEPROFILE_CHAR1_LEN;
req.pValue = GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle,ATT_WRITE_REQ,req.len,NULL,0);
if ( req.pValue != NULL )
{
*req.pValue = BLE_Send_Txt[0];
if( GATT_WriteLongCharValue(centralConnList[CONNECT0_ITEM].connHandle,&req,centralTaskId) == SUCCESS )
{      
centralConnList[CONNECT0_ITEM].procedureInProgress = TRUE;
centralDoWrite = !centralDoWrite;
tmos_start_task( centralConnList[CONNECT0_ITEM].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
}
else
{
GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
}
}  
}

接收方是这样的

uint8 txt[SIMPLEPROFILE_CHAR1_LEN];
static void simpleProfileChangeCB( uint8 paramID, uint8 *pValue, uint16 len )
{
  switch( paramID )
  {
    case SIMPLEPROFILE_CHAR1:
{
      tmos_memcpy( txt, pValue, len );
PRINT("profile ChangeCB CHAR1.. \n");
      break;
}
    case SIMPLEPROFILE_CHAR3:
{
      tmos_memcpy( txt, pValue, len );
PRINT("profile ChangeCB CHAR3..\n");
      break;
}
    default:
      // should not reach here!
      break;
  }
}


但调试结果是这样的:QQ截图20211205132844.jpg

wch的ble 协议栈里面,大量的使用了动态内存, 其中数据的传输就需要用到. 

在发送前,需要调用GATT_bm_alloc 函数,然后传入相关参数申请内存,如果内存申请成功,再把要传输的数据拷贝进去,然后再调用gatt的相关传输函数传输数据.


在你的代码里面,你申请内存成功后(req.pValue != NULL),

对内存赋值用的是:

*req.pValue = BLE_Send_Txt[0];

学过c语言的我们都知道, 这是一句的结果等价于:

req.pValue[0] = BLE_Send_Txt[0];  

仅此而已,

所以,你说的5个byte就第一个byte正常,是合理的.


上面的代码,如果需要5个byte都正常,下面的代码可以任选一种:

1, 当数组操作,循环赋值:

for(uint32_t i=0;i<5;i++) {

    req.pValue[i] = BLE_Send_Txt[i]; 

}

2,调用标准库内存copy:

memcpy(req.pValue,BLE_Send_Txt,5);

3,使用协议栈提供的内存copy函数:

tmos_memcpy(req.pValue,BLE_Send_Txt,5);




谢谢大哥,终于成功了,谢谢您!!!


顺便问一下大佬,这个读程序,读出来的结果是不是放到了req.pValue中,是不是像发送一样把数据搬出来就可以了,
如memcpy(req.pValue,BLE_Send_Txt,5);

else
{
// Do a read
attReadReq_t req;  
req.handle = centralConnList[CONNECT0_ITEM].charHdl;        
if( GATT_ReadCharValue( centralConnList[CONNECT0_ITEM].connHandle, &req, centralTaskId ) == SUCCESS )
{
centralConnList[CONNECT0_ITEM].procedureInProgress = TRUE;
centralDoWrite = !centralDoWrite;
}
}



read ,是有个过程的, 并不能立刻得到结果,


兄弟,能发一下,你的例程给我看一下吗,我是发一个数据正常,发多个数据就异常,420358111@QQ.com


如果是APP连接peripheral例程,默认是开启的1个字节长度,如果需要多字节,可以将这里的长度给大。

image.png

如果超过20字节,则需要开启MTU:

蓝牙BLE从机Peripheral讲解十二(MTU) - SweetTea_lllpc - 博客园


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