搜索

[蓝牙芯片] CH579的Peripheral例程发送多字节数据结尾会有乱码是什么情况

[复制链接]
207|9
 楼主 | 2020-3-25 14:06 | 显示全部楼层 | 奖励家园币|阅读模式
本帖最后由 Rookiezdk 于 2020-3-25 16:08 编辑

新手在用CH579的BLE Peripheral历程时,在使用SIMPLEPROFILE_CHAR1_UUID进行收发数据时,与手机进行联调,单字节没问题,但是自己修改了SIMPLEPROFILE_CHAR1_LEN 的长度为20,想的是可以收发20个字节的数据,但是发现在收发时,当发送数据长度不到20字节时,结尾会有乱码。没搞懂是怎么回事。 (EH8H}HRY0J$VEJF5J7DK{V.png
在这里用到手机发送的指令来实现控制LED灯,并打印到PC端。
[4[JM%D]E_9F~4AS@B]FO12.png



MB[Y`}%C{[S`3AQV$G]]7C2.png 1BEE2546B250F14DCA50BFC03D4E1EC6.jpg
可以看到我发送的是GREEN,想控制亮绿灯,但是在结尾会有乱码。在手机上接收也是这样。不知道是不是数据通道需要清除,不懂,请求大佬指导一下,谢谢。














使用特权

评论回复
| 2020-3-26 10:07 | 显示全部楼层 | 奖励家园币
本帖最后由 chzfmx 于 2020-3-26 10:08 编辑

取的数据长度不对,例程里默认是读取的 SIMPLEPROFILE_CHAR1_LEN 个字节,你需要改一下,改成读取实际接收到的字节数
  1. bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )
  2. {
  3.   bStatus_t ret = SUCCESS;
  4.   switch ( param )
  5.   {
  6.     case SIMPLEPROFILE_CHAR1:
  7.       tmos_memcpy( value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN );  //读SIMPLEPROFILE_CHAR1_LEN 字节
  8.       break;

  9.     case SIMPLEPROFILE_CHAR2:
  10.       tmos_memcpy( value, simpleProfileChar2, SIMPLEPROFILE_CHAR2_LEN );
  11.       break;      

  12.     case SIMPLEPROFILE_CHAR3:
  13.       tmos_memcpy( value, simpleProfileChar3, SIMPLEPROFILE_CHAR3_LEN );
  14.       break;  

  15.     case SIMPLEPROFILE_CHAR4:
  16.       tmos_memcpy( value, simpleProfileChar4, SIMPLEPROFILE_CHAR4_LEN );
  17.       break;

  18.     case SIMPLEPROFILE_CHAR5:
  19.       tmos_memcpy( value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN );
  20.       break;      
  21.       
  22.     default:
  23.       ret = INVALIDPARAMETER;
  24.       break;
  25.   }
  26.   
  27.   return ( ret );
  28. }
复制代码


使用特权

评论回复
| 2020-3-26 13:22 | 显示全部楼层 | 奖励家园币
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。 RTX截图未命名11.png

RTX截图未命名.png


使用特权

评论回复
 楼主 | 2020-3-26 17:05 | 显示全部楼层 | 奖励家园币
chzfmx 发表于 2020-3-26 10:07
取的数据长度不对,例程里默认是读取的 SIMPLEPROFILE_CHAR1_LEN 个字节,你需要改一下,改成 ...

我是在这个函数里面修改的,实测是可行的,谢谢了。 7PD]{E1COIBDEZKFC6AH7G3.png
1585213179(1).jpg


使用特权

评论回复
 楼主 | 2020-3-26 17:08 | 显示全部楼层 | 奖励家园币
本帖最后由 Rookiezdk 于 2020-3-26 17:09 编辑
WCHTech2 发表于 2020-3-26 13:22
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。

我是在这个函这样修改的,这样在读取20个字节的数据的时候,当手机发送的数据不足的时候结尾不会乱码 1585213179(1).jpg 7PD]{E1COIBDEZKFC6AH7G3.png

还有我想请问一下这四个函数的作用流程,例如当手机利用特征值1发送数据和读取数据的时候,这四个函数的工作顺序和具体点的流程,这个地方有点迷惑,希望能解答一下,谢谢!

7OF5W298TCDTN`GF@}G@XRJ.png
31N`GU(OTNODFMSWDX(XXPF.png
H6_EKK9GWJ4J9L$L88)V@AB.png

使用特权

评论回复
 楼主 | 2020-3-27 16:37 | 显示全部楼层 | 奖励家园币
WCHTech2 发表于 2020-3-26 13:22
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。

您好,我按照下面连接这种方式添加了一个类似于特征1的特征0xFFE6,不含通知属性,为什么在手机上还是只有5个特征值,就是在蓝牙CH579\EVT1\EXAM\BLE\Peripheral这个例程的基础上修改的。但是在手机上还是只有0XFFE1-oxffe5,不知道是为什么。
// Profile Parameters
#define SIMPLEPROFILE_CHAR1                   0  // RW uint8 - Profile Characteristic 1 value
#define SIMPLEPROFILE_CHAR2                   1  // RW uint8 - Profile Characteristic 2 value
#define SIMPLEPROFILE_CHAR3                   2  // RW uint8 - Profile Characteristic 3 value
#define SIMPLEPROFILE_CHAR4                   3  // RW uint8 - Profile Characteristic 4 value
#define SIMPLEPROFILE_CHAR5                   4  // RW uint8 - Profile Characteristic 5 value
#define SIMPLEPROFILE_CHAR6                   5  // RW uint8 - Profile Characteristic 6 value //GUA

// 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
#define SIMPLEPROFILE_CHAR6_UUID            0xFFE6      //GUA

// Simple Keys Profile Services bit fields
#define SIMPLEPROFILE_SERVICE               0x00000001

// Length of Characteristic 5 in bytes
#define SIMPLEPROFILE_CHAR5_LEN           5  

// Length of Characteristic 6 in bytes
#define SIMPLEPROFILE_CHAR6_LEN           20       //GUA

/************************************************************************/
// Characteristic 6 UUID: 0xFFF6
CONST uint8 simpleProfilechar6UUID[ATT_BT_UUID_SIZE] =
{
  LO_UINT16(SIMPLEPROFILE_CHAR6_UUID), HI_UINT16(SIMPLEPROFILE_CHAR6_UUID)
};

/**********************************************************************/

// Simple Profile Characteristic 6 Properties
static uint8 simpleProfileChar6Props = GATT_PROP_READ | GATT_PROP_WRITE | GATT_PROP_NOTIFY;

// Characteristic 6 Value
static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = {0};

// Simple Profile Characteristic 6 Configuration Each client has its own
// instantiation of the Client Characteristic Configuration. Reads of the
// Client Characteristic Configuration only shows the configuration for
// that client and writes only affect the configuration of that client.
static gattCharCfg_t simpleProfileChar6Config[GATT_MAX_NUM_CONN];

// Simple Profile Characteristic 6 User Description
static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6\0";

/*********************************************************************/
      // Characteristic 6 Declaration
      {
        { ATT_BT_UUID_SIZE, characterUUID },
        GATT_PERMIT_READ,
        0,
        &simpleProfileChar6Props
      },

      // Characteristic Value 6
      {
        { ATT_BT_UUID_SIZE, simpleProfilechar6UUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE,
        0,
        simpleProfileChar6
      },

      // Characteristic 6 configuration
      {
        { ATT_BT_UUID_SIZE, clientCharCfgUUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE,
        0,
        (uint8 *)simpleProfileChar6Config
      },

      // Characteristic 6 User Description
      {
        { ATT_BT_UUID_SIZE, charUserDescUUID },
        GATT_PERMIT_READ,
        0,
        simpleProfileChar6UserDesp
      },

/*******************************************************************/
    case SIMPLEPROFILE_CHAR6:  
      if ( len == SIMPLEPROFILE_CHAR6_LEN )   
      {  
        VOID osal_memcpy( simpleProfileChar6, value, SIMPLEPROFILE_CHAR6_LEN );
      }  
      else  
      {  
        ret = bleInvalidRange;  
      }  
      break;

/***************************************************************/
    case SIMPLEPROFILE_CHAR6:  
      VOID osal_memcpy( value, simpleProfileChar6, SIMPLEPROFILE_CHAR6_LEN );  
      break;

/***************************************************************/

      case SIMPLEPROFILE_CHAR6_UUID:  
        *pLen = SIMPLEPROFILE_CHAR6_LEN;  
        VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR6_LEN );  
        break;  

/******************************************************************/
      case SIMPLEPROFILE_CHAR6_UUID:  

      //Validate the value  
      // Make sure it's not a blob oper  
      if ( offset == 0 )  
      {  
        if ( len != SIMPLEPROFILE_CHAR6_LEN )  
        {  
          status = ATT_ERR_INVALID_VALUE_SIZE;  
        }  
      }  
      else  
      {  
        status = ATT_ERR_ATTR_NOT_LONG;  
      }  

      //Write the value  
      if ( status == SUCCESS )  
      {  
        VOID osal_memcpy( pAttr->pValue, pValue, SIMPLEPROFILE_CHAR6_LEN );  
        notifyApp = SIMPLEPROFILE_CHAR6;  
      }  

      break;  

/*********************************************************************/
  // Setup the SimpleProfile Characteristic Values
  {
    uint8 charValue1 = 1;
    uint8 charValue2 = 2;
    uint8 charValue3 = 3;
    uint8 charValue4 = 4;
    uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 };
    uint8 charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};   
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
    SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN, charValue6 );   
  }

/*************************************************************************/
//******************************************************************************               
//name:             simpleProfileChangeCB               
//introduce:        simple服务的回调函数
//parameter:        paramID: 特征值ID
//return:           none            
//author:           甜甜的大香瓜                     
//email:            897503845@qq.com         
//QQ group          香瓜BLE之CC2541(127442605)                     
//changetime:       2016.12.08                     
//******************************************************************************  
static void simpleProfileChangeCB( uint8 paramID )
{
  uint16 nGUA_ConnHandle;
  uint8 nbGUA_Char6[20] = {0};  

  switch( paramID )
  {
    //char1
    case SIMPLEPROFILE_CHAR1:
    {
      break;      
    }

    //char3
    case SIMPLEPROFILE_CHAR3:
    {
      break;      
    }

    //char6
    case SIMPLEPROFILE_CHAR6:  
    {
      //获取连接句柄
      GAPRole_GetParameter(GAPROLE_CONNHANDLE, &nGUA_ConnHandle);

      //读取char6的数值
      SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR6, &nbGUA_Char6);

      //发送数据  
      GUA_SimpleGATTprofile_Char6_Notify(nGUA_ConnHandle, nbGUA_Char6, 20);

      break;      
    }        

    default:
    {
      break;
    }  
  }
}

/****************************************************************************/
就是按照上面这个步骤,模仿着在在官网wch.cn下载的例程测试Peripheral例程中修改的,但是不知道为什么在手机端搜索不到。

使用特权

评论回复
| 2020-3-30 10:57 | 显示全部楼层 | 奖励家园币
Rookiezdk 发表于 2020-3-27 16:37
您好,我按照下面连接这种方式添加了一个类似于特征1的特征0xFFE6,不含通知属性,为什么在手机上还是只 ...

可以参考这个例子修改 Peripheral.zip (931.72 KB, 下载次数: 2)

使用特权

评论回复
 楼主 | 2020-3-30 11:28 | 显示全部楼层 | 奖励家园币
本帖最后由 Rookiezdk 于 2020-3-30 11:45 编辑
WCHTech2 发表于 2020-3-30 10:57
可以参考这个例子修改

您好,我看了这个例子,也下载到CH579的开发板上测试了,但是在手机上搜索到的还是到OXFFE5,没有0XFFE6,我自己也是这么修改的,只不过不是要PIN码,而是跟特征1一样的具有读写属性的,但是发现在手机上不显示。 76DF9615E2E1AACA1C36213BF5A03193.png
我这是用这收到的这个列子测试的,也是不显示。

使用特权

评论回复
| 2020-3-30 13:08 | 显示全部楼层 | 奖励家园币
Rookiezdk 发表于 2020-3-30 11:28
您好,我看了这个例子,也下载到CH579的开发板上测试了,但是在手机上搜索到的还是到OXFFE5,没有0XFFE6, ...

您再试试,我这边测试了几次,都可以搜索到的。
WCH BLE.jpg

使用特权

评论回复
 楼主 | 2020-3-30 14:01 | 显示全部楼层 | 奖励家园币
WCHTech2 发表于 2020-3-30 13:08
您再试试,我这边测试了几次,都可以搜索到的。

可以了,原来修改的就是可行的,问题在这个软件上面,原来的好像是建立的有bonded,要再这个里面把记录删掉,之后才会更新。谢谢!
3CBB21D14DDA953E5AE13AA156DC7F9A.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表