打印
[蓝牙芯片]

CH579的Peripheral例程发送多字节数据结尾会有乱码是什么情况

[复制链接]
1472|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Rookiezdk 于 2020-3-25 16:08 编辑

新手在用CH579的BLE Peripheral历程时,在使用SIMPLEPROFILE_CHAR1_UUID进行收发数据时,与手机进行联调,单字节没问题,但是自己修改了SIMPLEPROFILE_CHAR1_LEN 的长度为20,想的是可以收发20个字节的数据,但是发现在收发时,当发送数据长度不到20字节时,结尾会有乱码。没搞懂是怎么回事。
在这里用到手机发送的指令来实现控制LED灯,并打印到PC端。





可以看到我发送的是GREEN,想控制亮绿灯,但是在结尾会有乱码。在手机上接收也是这样。不知道是不是数据通道需要清除,不懂,请求大佬指导一下,谢谢。














使用特权

评论回复
沙发
chzfmx| | 2020-3-26 10:07 | 只看该作者
本帖最后由 chzfmx 于 2020-3-26 10:08 编辑

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

    case SIMPLEPROFILE_CHAR2:
      tmos_memcpy( value, simpleProfileChar2, SIMPLEPROFILE_CHAR2_LEN );
      break;      

    case SIMPLEPROFILE_CHAR3:
      tmos_memcpy( value, simpleProfileChar3, SIMPLEPROFILE_CHAR3_LEN );
      break;  

    case SIMPLEPROFILE_CHAR4:
      tmos_memcpy( value, simpleProfileChar4, SIMPLEPROFILE_CHAR4_LEN );
      break;

    case SIMPLEPROFILE_CHAR5:
      tmos_memcpy( value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN );
      break;      
      
    default:
      ret = INVALIDPARAMETER;
      break;
  }
  
  return ( ret );
}


使用特权

评论回复
板凳
WCHTech2| | 2020-3-26 13:22 | 只看该作者
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。




使用特权

评论回复
地板
Rookiezdk|  楼主 | 2020-3-26 17:05 | 只看该作者
chzfmx 发表于 2020-3-26 10:07
取的数据长度不对,例程里默认是读取的 SIMPLEPROFILE_CHAR1_LEN 个字节,你需要改一下,改成 ...

我是在这个函数里面修改的,实测是可行的,谢谢了。



使用特权

评论回复
5
Rookiezdk|  楼主 | 2020-3-26 17:08 | 只看该作者
本帖最后由 Rookiezdk 于 2020-3-26 17:09 编辑
WCHTech2 发表于 2020-3-26 13:22
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。

我是在这个函这样修改的,这样在读取20个字节的数据的时候,当手机发送的数据不足的时候结尾不会乱码

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




使用特权

评论回复
6
Rookiezdk|  楼主 | 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例程中修改的,但是不知道为什么在手机端搜索不到。

使用特权

评论回复
7
WCHTech2| | 2020-3-30 10:57 | 只看该作者
Rookiezdk 发表于 2020-3-27 16:37
您好,我按照下面连接这种方式添加了一个类似于特征1的特征0xFFE6,不含通知属性,为什么在手机上还是只 ...

可以参考这个例子修改 Peripheral.zip (931.72 KB)

使用特权

评论回复
8
Rookiezdk|  楼主 | 2020-3-30 11:28 | 只看该作者
本帖最后由 Rookiezdk 于 2020-3-30 11:45 编辑
WCHTech2 发表于 2020-3-30 10:57
可以参考这个例子修改

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

使用特权

评论回复
9
Rookiezdk|  楼主 | 2020-3-30 14:01 | 只看该作者
WCHTech2 发表于 2020-3-30 13:08
您再试试,我这边测试了几次,都可以搜索到的。

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

使用特权

评论回复
10
东方之光| | 2021-1-5 15:25 | 只看该作者
CH579中的Peripheral例程为啥和手机连接总是断连?

使用特权

评论回复
11
WCHTech2| | 2021-1-8 17:11 | 只看该作者
东方之光 发表于 2021-1-5 15:25
CH579中的Peripheral例程为啥和手机连接总是断连?

请问使用的是沁恒的评估板和BLE调试助手吗,我这使用和例程和评估板,测试可正常连接BLE调试助手,没有断连的现象,如果是自己制作的PCB可将原理图和实物图贴出来,或者可电话咨询蓝牙FAE:025-52635389

使用特权

评论回复
12
东方之光| | 2021-1-9 11:20 | 只看该作者
WCHTech2 发表于 2021-1-8 17:11
请问使用的是沁恒的评估板和BLE调试助手吗,我这使用和例程和评估板,测试可正常连接BLE调试助手,没有断 ...

自己画的图

2021-01-09_111805.png (145.71 KB )

2021-01-09_111805.png

2021-01-09_111907.png (307.37 KB )

2021-01-09_111907.png

使用特权

评论回复
13
苏大胡工| | 2021-3-4 17:34 | 只看该作者
WCHTech2 发表于 2020-3-26 13:22
Peripheral例程修改如下,测试正常,可以在官网wch.cn下载最新例程测试。

你好,我的情况是,设置字节长度20,我用手机发送的数据字节数不到20,从机就接收不到数据,什么原因

使用特权

评论回复
14
WCHTech2| | 2021-3-5 09:34 | 只看该作者
苏大胡工 发表于 2021-3-4 17:34
你好,我的情况是,设置字节长度20,我用手机发送的数据字节数不到20,从机就接收不到数据,什么原因 ...

您好,Peripheral程序里做了接收长度限制,可以在gattprofile.h里修改
// Length of characteristic in bytes ( Default MTU is 23 )
#define SIMPLEPROFILE_CHAR1_LEN               1  
#define SIMPLEPROFILE_CHAR2_LEN               1  
#define SIMPLEPROFILE_CHAR3_LEN               1  
#define SIMPLEPROFILE_CHAR4_LEN               1  
#define SIMPLEPROFILE_CHAR5_LEN               5

使用特权

评论回复
15
便携手到老| | 2021-3-5 16:28 | 只看该作者
这个进行连接的时候,是否可以进行密码的设置呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝