TI中文支持网
TI专业的中文技术问题搜集分享网站

请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?

1.使用BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral 的demo

在SimpleBLEPeripheral_ProcessEvent 事件最后添加自己的发送数据事件定义为0x0004

  if( events & SBP_BURST_EVT)
  {
      if ( SBP_PERIODIC_EVT_PERIOD )
    {
      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    }
      sendData();
    sendData();
 
    return (events ^ SBP_BURST_EVT);
  }

发送数据测试函数:

static void sendData(void )
{
     static uint16 counter=0;
    uint8 burstData[20] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0};        
  
    attHandleValueNoti_t nData;
    nData.len = 20;
    nData.handle = 20;
     //skKeyPressed = *((uint8*)pValue);
    osal_memcpy( &nData.value, &burstData, 20 );

    // Send the Notification
    if (GATT_Notification( 0, &nData, FALSE )==SUCCESS)
    {
      counter++;
    }

       if(counter >1000)    {
      osal_stop_timerEx(simpleBLEPeripheral_TaskID,SBP_BURST_EVT);
      counter = 0;
    }  

}

在学习GATT_Notification发数据。。请问下使用BTool怎么接收。

2.除了这种从机发数据给主机的方式,还有没有其他数据发送方式,有无demo可以看。

3.烧写自带编译好的CC2541_keyfob_SimpleBLEPeripheral.hex  亮灯都正常,但是自己编译的hex烧录进去灯就不亮。

Zhao Fan1:

回复 jason jason4:

回复,使用您的方法,能够连续不停得发包到主,使用BTool也能看到。

但是我是想单独只发一次,而不是这种轮询执行.

想了个笨办法,使用全局变量去做。但是我感觉这种方法太笨,不智能。

或者我对架构还不熟悉。

我想连接成功后,只传一次。就像小米手环那种,一连接,自动更新数据(把信息传到手机或者自动更新版本)。只做一次。

有没有大概的个位置。。。虽然看了user guide,但是没有demo感觉还是理解不透彻。。。

——————————————–

这是第一步,第二步,我是想学习event事件,建立自己能控制整个流程,这样能更好把握问题所在。最近要培训没时间看代码。。。

jason jason4:

回复 Zhao Fan1:

你把那三行定时器的删了就行了,就会只进一次

Zhao Fan1:

回复 jason jason4:

if ( events & SBP_PERIODIC_EVT )  {    // Restart timer  //  if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器  //  {      //osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );    //}

     sendData();      // Perform periodic application task    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);  }

 

我把3个重启定时器删除后,连接成功后,就收不到senddata里面的数据了。。。

[24] : <Info> – 09:27:58.155Device ConnectedHandle = 0x0000Addr Type = 0x00 (Public)BDAddr = 84:DD:20:C5:52:69————————————————————————————————————————[25] : <Rx> – 09:27:58.110-Type  : 0x04 (Event)-EventCode : 0xFF (HCI_LE_ExtEvent)-Data Length : 0x13 (19) bytes(s) Event  : 0x0605 (GAP_EstablishLink) Status  : 0x00 (Success) DevAddrType : 0x00 (Public) DevAddr  : 84:DD:20:C5:52:69 ConnHandle : 0x0000 (0) ConnInterval : 0x0050 (80) ConnLatency : 0x0000 (0) ConnTimeout : 0x07D0 (2000) ClockAccuracy : 0x00 (0)Dump(Rx):04 FF 13 05 06 00 00 69 52 C5 20 DD 84 00 00 50 00 00 00 D0 07 00 ————————————————————————————————————————[26] : <Rx> – 09:28:04.792-Type  : 0x04 (Event)-EventCode : 0xFF (HCI_LE_ExtEvent)-Data Length : 0x0B (11) bytes(s) Event  : 0x0607 (GAP_LinkParamUpdate) Status  : 0x00 (Success) ConnHandle : 0x0000 (0) ConnInterval : 0x0320 (800) ConnLatency : 0x0000 (0) ConnTimeout : 0x03E8 (1000)Dump(Rx):04 FF 0B 07 06 00 00 00 20 03 00 00 E8 03 ————————————————————————————————————————

最后没有用开始自己模仿写的事件,而是在 events & SBP_START_DEVICE_EVT  之后的events & SBP_PERIODIC_EVT中添加。。

期待大牛再次指点。。。

 

jason jason4:

回复 Zhao Fan1:

我只是正好做过这块而已。

定时器只是在规定时间后产生一个事件,你在 SBP_PERIODIC_EVT这个周期事件中把定时器关了只是说这个事件只触发一次。如果你需要senddata()也只触发一次的话这样是可以的。关于SBP_PERIODIC_EVT这个事件的产生,因为内部处理的是发送,肯定不是放在SBP_START_DEVICE_EVT设备初始化之后执行,你把它放在两个设备成功建立连接或者绑定后,再让它发送就可以了。你的两个设备都没连接怎么发送。。。

Zhao Fan1:

回复 jason jason4:

[24] : <Info> – 09:27:58.155Device ConnectedHandle = 0x0000Addr Type = 0x00 (Public)BDAddr = 84:DD:20:C5:52:69

已经连接上了。。。

uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events ){

  VOID task_id; // OSAL required parameter that isn't used in this function

  if ( events & SYS_EVENT_MSG )  {    uint8 *pMsg;

    if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL )    {      simpleBLEPeripheral_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );

      // Release the OSAL message      VOID osal_msg_deallocate( pMsg );    }

    // return unprocessed events    return (events ^ SYS_EVENT_MSG);  }

  if ( events & SBP_START_DEVICE_EVT )  {    // Start the Device    VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

    // Start Bond Manager    VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );

    // Set timer for first periodic event    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );    return ( events ^ SBP_START_DEVICE_EVT );  }

  if ( events & SBP_PERIODIC_EVT )  {    // Restart timer    if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器    {      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );    }         sendData();//————–》这个事我加的函数(纯粹调用了一下notification)      // Perform periodic application task    performPeriodicTask();

    return (events ^ SBP_PERIODIC_EVT);  }  // Discard unknown events  return 0;}

有这段是不停的发

    if ( SBP_PERIODIC_EVT_PERIOD )//不停重启计时器    {      osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );    }

没有这段,虽然是连接上了,但是没发的。。。

我想的是: if ( SBP_PERIODIC_EVT_PERIOD ) 一直为真,所以一直在重启定时器。

如果把这个去掉了,也是一直在重启定时器。

如果把这三行都去掉,因为没有获得此事件所以没有执行。。。

jason jason4:

回复 Zhao Fan1:

你理解错了,SBP_START_DEVICE_EVT里面你就把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );这个事件产生了,这个时候肯定是没有来得及建立连接的,也就是说你的设备初始化后会直接去进行发送这个动作,后来才显示连接了。你的发送是在连接之前的。你可以把notifacation的返回值打印出来,SUCCESS才是成功提交到底层进行发送。其他5个返回值都是不对的,你打印出来一看就知道了。

另一种你在时间里面加个定时器让他成为周期的,那后来建立连接就发了啊,前面的是不发的。

你要把osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );第一次的产生放到真正建立连接后。

我试过,可行的,我的速度也是这么测的,没有问题。

jason jason4:

回复 jason jason4:

对了,你把4次调用sendata();下面那行hci buffer初始化的去掉,要不然是错误的

Zhao Fan1:

回复 jason jason4:

是我对这个流程没弄明白

把senddata放到connected之后就好了。。。

多谢啦。

赞(0)
未经允许不得转载:TI中文支持网 » 请教CC2541 Keyfob做从机,给Usb dongle 发GATT_Notification数据,dongle接收到哪里了?
分享到: 更多 (0)