cc2540特征值查找之同时查找两个特征值

本文详细解析了蓝牙低功耗(BLE)设备通过GATT协议进行服务、特性和属性发现的过程。具体介绍了如何利用attReadByTypeReq_t结构体发起读取请求,并通过响应消息确定已发现的服务范围及特性句柄。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
{ 
  
   attReadByTypeReq_t req;  
   if ( simpleBLEDiscState == BLE_DISC_STATE_SVC )   
   {    
      // Service found, store handles    
      if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&       
       pMsg->msg.findByTypeValueRsp.numInfo > 0 )   
      {      
        simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;  
        simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;    
       }    
  
      // If procedure complete    
      if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  &&           
      pMsg->hdr.status == bleProcedureComplete ) ||         
      ( pMsg->method == ATT_ERROR_RSP ) )   
      {      
        if ( simpleBLESvcStartHdl != 0 )      
        {        
          // Discover characteristic       
          simpleBLEDiscState = BLE_DISC_STATE_CHAR1;      
          req.startHandle = simpleBLESvcStartHdl;    
          req.endHandle = simpleBLESvcEndHdl;    
          req.type.len = ATT_BT_UUID_SIZE;
          req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);    
          req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);      
          GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );     
         }    
      }  
  }  
  
  else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR1 )  
  {    
    // Characteristic found, store handle    
     if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&      
        pMsg->msg.readByTypeRsp.numPairs > 0 )
        {      
           simpleBLECharHdl[0] = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],                         
           pMsg->msg.readByTypeRsp.dataList[1] );      
    
           LCD_WRITE_STRING( "CHAR 1 Found", HAL_LCD_LINE_1 );      
           simpleBLEProcedureInProgress = TRUE;      
       }
     else // pMsg->msg.readByTypeRsp.numPairs is 0.
     {
       simpleBLEDiscState = BLE_DISC_STATE_CHAR2;    
       req.startHandle = simpleBLESvcStartHdl;  
       req.endHandle = simpleBLESvcEndHdl;   
       req.type.len = ATT_BT_UUID_SIZE;    
       req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR2_UUID);   
       req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR2_UUID);    
       GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );  
     }
  }  
  
  else if (simpleBLEDiscState == BLE_DISC_STATE_CHAR2)  
  {     // Characteristic found, store handle    
    if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&     
    pMsg->msg.readByTypeRsp.numPairs > 0 )    
    {      
      simpleBLECharHdl[1] = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],                                      
      pMsg->msg.readByTypeRsp.dataList[1] );     
      LCD_WRITE_STRING( "CHAR 2 Found", HAL_LCD_LINE_2 );      
      simpleBLEProcedureInProgress = FALSE;  
    }    
    simpleBLEDiscState = BLE_DISC_STATE_IDLE;
  }

}

### Halcon中比对两个轮廓的方法及函数 在Halcon中,比对两个轮廓可以通过多种方式实现。以下是几种常用的方法和相关函数: 1. **轮廓匹配** 使用`create_shape_model_xld`和`find_shape_model`函数可以创建一个形状模型,并通过搜索找到与该模型相似的轮廓[^3]。此方法适用于需要进行模板匹配的情况。首先,使用`create_shape_model_xld`创建一个基于参考轮廓的形状模型,然后通过`find_shape_model`在目标图像中查找匹配的轮廓。 2. **轮廓拟合对比** 对于两个轮廓的几何特性对比,可以使用`fit_rectangle2_contour_xld`等拟合函数分别拟合两个轮廓为矩形或其他几何形状,并比较拟合后的参数(如中心点、方向、边长等)。如果这些参数接近,则说明两个轮廓相似[^2]。 3. **轮廓点集对比** 使用`compare_regions`或`symm_difference`函数可以间接比较两个轮廓的区域差异。虽然这些函数主要用于区域操作,但可以通过将轮廓转换为区域(例如使用`gen_region_contour_xld`)后进行对比[^1]。 4. **轮廓特征提取与对比** 提取轮廓的几何特征(如长度、面积、周长等),并进行数值对比。可以使用`get_contour_global_attrib_xld`获取轮廓的全局属性,并比较这些属性值是否一致[^5]。 5. **轮廓距离计算** 使用`distance_cc`函数计算两个轮廓之间的最小距离,或者使用`distance_cpoint`计算轮廓到特定点的距离,从而判断两个轮廓的相对位置关系[^4]。 6. **轮廓分割与局部对比** 如果轮廓较为复杂,可以先使用`segment_contours_xld`将轮廓分割为多个部分,然后逐段进行对比。对于每一段,可以使用上述方法中的任意一种进行详细分析。 ```python # 示例代码:使用fit_rectangle2_contour_xld进行轮廓对比 Row1, Column1, Phi1, Length1_1, Length2_1 = fit_rectangle2_contour_xld(Contour1, 'clipped', 0, 360, 2) Row2, Column2, Phi2, Length1_2, Length2_2 = fit_rectangle2_contour_xld(Contour2, 'clipped', 0, 360, 2) # 比较拟合参数 if abs(Row1 - Row2) < threshold and abs(Column1 - Column2) < threshold and abs(Phi1 - Phi2) < angle_threshold: print("轮廓相似") else: print("轮廓不相似") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值