打印

cc2540一主多从连接问题

[复制链接]
4299|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengxing1991|  楼主 | 2014-10-21 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想麻烦各位大神,CC2540的一主多从实现轮询功能,能够读取从机的数据,一主一从可以实现,但是我现在遇到的问题是在上电自动连接好第一个扫描到的从机之后,在连接第二个所扫描的从机时,那个从机显示connected,而主机缺显示disconnected :reason 22!然后主机接受的数据也不变化!,万分感谢

相关帖子

沙发
dirtwillfly| | 2014-10-21 19:58 | 只看该作者
在网上看到的,你参考下吧:
主机为smartRF开发板,从机为两个cc2540设备,首先搜索设备,然后选择设备连接,一次选择一个进行连接,连接好了再同样操作连接下一个(能不能同时连接?)。连接好了之后给设备发命令,其实还是一个一个发数据的,还没找到同时发数据的方法。程序在SimpleBLECentral基础上改的。

主要修改的地方有:

回调函数中显示所有搜索到的从设备地址:

static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )
{
   switch ( pEvent->gap.opcode )
   {
     case GAP_DEVICE_INIT_DONE_EVENT:  //设备初始化
      {
         LCD_WRITE_STRING( "BLE Central", HAL_LCD_LINE_1 );
         LCD_WRITE_STRING( bdAddr2Str( pEvent->initDone.devAddr ),  HAL_LCD_LINE_2 );
         LCD_LINE_= 0x04;
         simpleBLEConnHandle_num = 0;
       }
       break;


     case GAP_DEVICE_INFO_EVENT:
       {
         // if filtering device discovery results based on service UUID
         if ( DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE )
         {
           if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,
                                      pEvent->deviceInfo.pEvtData,
                                      pEvent->deviceInfo.dataLen ) )
           {
             simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType );//向设备发现列表中添加一个设备
            LCD_WRITE_STRING( "AdvDevice_Addr:", HAL_LCD_LINE_3 );
             LCD_WRITE_STRING( bdAddr2Str( pEvent->deviceInfo.addr ),  LCD_LINE_);//显示所有广告设备地址
            LCD_LINE_++;//每增加一个设备屏幕换一行
          }
         }
       }
       break;

case GAP_DEVICE_DISCOVERY_EVENT://设备发现完成
      {
         // discovery complete
         simpleBLEScanning = FALSE;
         // if not filtering device discovery results based on service UUID
         if ( DEFAULT_DEV_DISC_BY_SVC_UUID == FALSE )
         {
           // Copy results
           simpleBLEScanRes = pEvent->discCmpl.numDevs;
           osal_memcpy( simpleBLEDevList, pEvent->discCmpl.pDevList,
                        (sizeof( gapDevRec_t ) * pEvent->discCmpl.numDevs) );
         }
         
         LCD_WRITE_STRING_VALUE( "Devices Found", simpleBLEScanRes,
                                 10, HAL_LCD_LINE_1 );
         if ( simpleBLEScanRes > 0 )
         {
           LCD_WRITE_STRING( "<- To Select", HAL_LCD_LINE_2 );
         }


         // initialize scan index to last device
         simpleBLEScanIdx = simpleBLEScanRes;


       }
       break;


     case GAP_LINK_ESTABLISHED_EVENT://设备连接
      {
         if ( pEvent->gap.hdr.status == SUCCESS )
         {         
           simpleBLEState = BLE_STATE_CONNECTED;
           simpleBLEConnHandle= pEvent->linkCmpl.connectionHandle;
           ConnHandle[simpleBLEConnHandle_num] =pEvent->linkCmpl.connectionHandle;//将handle存起来,供主机发送数据的时候使用
          simpleBLEConnHandle_num++;//每连接一个设备增加一次
          simpleBLEProcedureInProgress = TRUE;   








发起连接请求:

  if ( keys & HAL_KEY_CENTER )//建立连接
  {
     uint8 addrType;
     uint8 *peerAddr;
     
     // Connect or disconnect
    // if ( simpleBLEState == BLE_STATE_IDLE )//屏蔽状态判断,任何时候都可以建立连接
   // {
       // if there is a scan result
       if ( simpleBLEScanRes > 0 )
       {
         // connect to current device in scan result
         peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
         addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;
      
         simpleBLEState = BLE_STATE_CONNECTING;
         
         GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                       DEFAULT_LINK_WHITE_LIST,
                                       addrType, peerAddr );//发起建立连接请求
  
         LCD_WRITE_STRING( "Connecting", HAL_LCD_LINE_1 );
         LCD_WRITE_STRING( bdAddr2Str( peerAddr ), HAL_LCD_LINE_2 );
       }








发送数据的时候调用函数(算不上实际意义上的同时控制):

        GATT_WriteCharValue( ConnHandle[0], &req, simpleBLETaskId );//发给设备1
         GATT_WriteCharValue( ConnHandle[1], &req, simpleBLETaskId ); //发给设备2


        ………………

使用特权

评论回复
板凳
dirtwillfly| | 2014-10-21 20:00 | 只看该作者
也可以参考一下的官方代码:http://processors.wiki.ti.com/in ... EPeripheral_devices

使用特权

评论回复
地板
fengxing1991|  楼主 | 2014-10-21 23:41 | 只看该作者
dirtwillfly 发表于 2014-10-21 19:58
在网上看到的,你参考下吧:
主机为smartRF开发板,从机为两个cc2540设备,首先搜索设备,然后选择设备连接 ...

这个实现的只是一主一从的连接,而我现在遇到的问题是第一个扫描到的从机连接完成在断开之后,在连接扫描到的第二个从机是不能正确的读取该从机的数据

使用特权

评论回复
5
fengxing1991|  楼主 | 2014-10-21 23:46 | 只看该作者
dirtwillfly 发表于 2014-10-21 20:00
也可以参考一下的官方代码:http://processors.wiki.ti.com/index.php/SimpleBLECentral_Connect_to_Multi_ ...

谢谢哈,我在仔细看看

使用特权

评论回复
6
tuzihog| | 2014-10-22 17:30 | 只看该作者
关注一下

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝