微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > cc2540 主从机每个connection event发送数据包个数问题

cc2540 主从机每个connection event发送数据包个数问题

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

hi,大家好。

我参考了serialapp2的代码,看它的代码中每个connection event发送3个包,每个包最大20bytes,使用的是notify的方式。

但是这个例子是从机发送给主机的。我如果想让主机在每个connection event向从机发送3个包。该调用那个函数,我调用的GATT_WriteCharValue,但是实现不了连续发3个包。每次只能发送一个。

现在的结果就是从机->主机  速度较快。 主机->从机  速度较慢。

请问主机如何在一个connection event向从机发送3个包。

hi hui,

试一下 GATT_WriteLongCharValue() 怎么样?

GATT_WriteLongCharValue() 能否连续调用?是否有次数限制?

我遇到通过按键触发调用GATT_WriteLongCharValue() 发数据20字节到从机,

发送次数达到85次时候GATT_WriteLongCharValue() 反馈的status=0x16 不是 success ,

应该怎么解决问题

谢谢

Hi Yan,

GATT_WriteCharValue();这个函数每次最大只能发20个字节的数吗?我看代码好像是。

GATT_WriteCharValue( uint16 connHandle, attWriteReq_t *pReq, uint8 taskId );

比如,当发送一串数组a [ ]={0x01,0x02,0x03} ;时,

        // Do a write
        attWriteReq_t req;
       
        req.handle = simpleBLECharHdl;
        req.len = 3;

        for(i = 0;i<3;i++) { req.value[i ] = a[ i];}
         req.sig = 0;
        req.cmd = 0;
        status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId ); 

我这么写对不对呢?谢谢!

xie,

是的, 最大20.

你可以这么写, 自己尝试一下就知道对不对了 :) 

欢迎多动手!

Hi,xie

我用GATT_WriteCharValue()向从机写3个字节,从机只能收到1个字节,我看网上有的说从机需要设置,请问是在哪设置的?simpleGATTprofile.c里面的simpleProfile_WriteAttrCB()里面if (len != 1 )已经被我改成if (len>=30),还是只能收到一个字节

我也不是很清楚,没有试验过,可能是接收回调写的就是一个字节导致的吧,bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ) {   bStatus_t ret = SUCCESS;   switch ( param )   {     case SIMPLEPROFILE_CHAR1:       *((uint8*)value) = simpleProfileChar1;……

 

 

// Characteristic 1 Value static

 uint8 simpleProfileChar1 = 0;这是一个字节,你改成一个数组或者一个字符串试试。期待您的结果,让我学习学习,谢谢

感谢你的回复。我试着改成uint16 simpleProfileChar1 = 0,在编译的时候报错,说在

/*********************************************************************
* Profile Attributes - Table
*/

static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] =
{

// Characteristic Value 1
{
{ ATT_BT_UUID_SIZE, simpleProfilechar1UUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
&simpleProfileChar1
},

其中的&simpleProfileChar1 是16位的地址,而gattAttribute_t定义的结构体最后一个应该是8位的指针。要是改变gattAttribute_t定义的话又要牵扯到Characteristic 2,Characteristic 3。

我试着把simpleProfileChar1定义成数组形式报错更多,具体报错还没仔细看

都是uint8的啊,哪里来的uint16 ? 注意这里都是用指针进行操作。

如果将simpleProfileChar1改成数组,那么假设uint8 simpleProfileChar1 = [0x01,0x02]; 

那么

uint8 data_len = 2;

bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )
{
  bStatus_t ret = SUCCESS;
  switch ( param )
  {
    case SIMPLEPROFILE_CHAR1:
      //*((uint8*)value) = simpleProfileChar1;

      VOID osal_memcpy( value, simpleProfileChar1, data_len ); //用copy函数将数组copy出来,copy长度等于数组长度。
      break;

 

这是参照别人写的代码,看看行不行,期待你的结果。

uint8 simpleProfileChar1 = [0x01,0x02];这句是C语言吗?我刚刚开始涉足时间不太久,可能有的不太懂。为什么申明了一个1字节变量,后面可以这样赋值呢?我在编译器里试了一下,报错说expected an expression。多谢解答

不好意思,写错了,是{},低端了,⊙﹏⊙b汗

换成{}好像也不太对,前面的不是uint8 simpleProfileChar1吗,应该是申明的一个变量,后面的怎么给赋值一个数组呢?是不是该改成uint8 simpleProfileChar1[ ]?

都行,赋值是默认的值,你可以全为0;

不好意思,因为放假回复晚了。我是说static uint8 simpleProfileChar1={0,0};左边是变量,右边是数组,这样可以吗?你成功进行过一次发送多个字节实验吗?

肯定可以啊,我虽然没有做过,但是我有代码,我还知道一次可以发20个字节,我看到人家这样做的。

我也看到了网上说一次可以发20个字节的,我照着修改怎么都不行。你能不能把你的主机发送代码、从机接收代码、simpleGATTprofile.c、simpleGATTprofile.h发给我参考一下,我的邮箱是treefw@163.com,麻烦你了!

好!

hi, hui

请问一下你看的那个serialapp2程序一个链接时间连续发送三个包的程序在哪里?能把地址发给我一下么?从机发给主机的......

谢谢了呀~~

请问,你用GATT_WriteCharValue怎么实现,向从机通信,能将代码贴一下,我是新手,想参考一下,谢谢了

attWriteReq_t AttReq;
uint8 *p = AttReq.value;
for (uint8 i=0;i<send_len;i++)
{
*p++=SerialRxBuff[i+offs_RxBuf];
}
AttReq.handle = simpleBLECharHd6;
AttReq.len = send_len;
AttReq.sig = 0;
AttReq.cmd = 0;
GATT_WriteCharValue( simpleBLEConnHandle, &AttReq, simpleBLETaskId );

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

网站地图

Top