微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > CC2541 center端发送20字节数据到从机,只能发一次?

CC2541 center端发送20字节数据到从机,只能发一次?

时间:10-02 整理:3721RD 点击:

CC2541 center端发送20字节数据到从机,只能发一次?


我现在需要CC2541 center端发送多个字节(超过20个,最多为255)的数据到从机,我是分包进行发送的,数据通道规定大小为20个字节,比如我发100个字节,我要发送5次完成,但是实际上,只有第一次的头20个字节发送成功,后续的字节能够发送,调用GATT_WriteCharValue也返回success,但是收不到MSG。
我发送的程序为一个子函数,如下:

void write_center_data_to_client()//向center数据通道写入数据,大小为20个字节
{
  if ( simpleBLEState == BLE_STATE_CONNECTED &&
        CENTER_data_valueHdl != 0 &&
        simpleBLEProcedureInProgress == FALSE )
  {//必须为可读写状态才能读写
   
    attWriteReq_t req;
    req.handle = CENTER_data_valueHdl;
    req.len = 20;
    osal_memcpy(req.value,center_data_buff,req.len);
    req.sig = 0;
    req.cmd = 0;
   
    if ( GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ) == SUCCESS )
    {
      simpleBLEProcedureInProgress = TRUE;
    }
    else
    {
      simpleBLEProcedureInProgress = FALSE;
    }
  }
}

其中uint8 center_data_buff[20];//固定向client写入的20字节数据缓冲

在发送的时候,首先调用这个子函数发送第一包,然后在MSG函数中得到回应后,才发送第二包,如此循环,我将后续函数放到这里:

  else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )//写特征值回调确认状态
  {
   
    if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
      
      LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a succesful write, display the value that was written and increment value
      LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );      
      
      //写入特征值数据正确,可继续写入
      if(Start_send_ble_data_flag != SEND_BLE_DATA_IDLE)
      {
        CENTER_data_divide_packet_send_to_client(Uart1_RxBuf,Uart1_RxBuf[1]);//发送串口收到的指令数据
      }
    }
   
    simpleBLEProcedureInProgress = FALSE;   

  }

红色部分为我自己的分包函数,发送第一部分后,得到响应,程序会自动发送第二包。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top