CH579M作为主机怎样查找从机,求助!

一.从机为另一款芯片蓝牙模块,Uuid分别为

Server_Uuid:

D973F2E0-B19E-11E2-9E96-080020F29A66

Tx_Uuid:

D973F2E1-B19E-11E2-9E96-9E08000C9A66

Rx_Uuid:

D973F2E2-B19E-11E2-9E96-0800200C9A66

使用Central例程,修改以下

uint8_t server_uuid[16]= {0xD9,0x73,0xF2,0xE0,0xB1,0x9E,0x11,0xE2,0x9E,0x96,0x08,0x00,0x20,0xF2,0x9A,0x66};
static void centralStartDiscovery( void )
{
//  uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(SIMPLEPROFILE_SERV_UUID),
//                                   HI_UINT16(SIMPLEPROFILE_SERV_UUID) };
  
  // Initialize cached handles
  centralSvcStartHdl = centralSvcEndHdl = centralCharHdl = 0;
  centralDiscState = BLE_DISC_STATE_SVC;
  
  // Discovery simple BLE service
  GATT_DiscPrimaryServiceByUUID( centralConnHandle,
                                 server_uuid,
                                 ATT_UUID_SIZE,
                                 centralTaskId );
}

上述代码执行无法查询到服务Handle,需要怎样修改

二.如果在不知道对方Uuid的情况下,在通过Mac连接到从机设备后怎样获取uuid

待连接的蓝牙芯片的UUID是128bit,CH58xcentral默认是16bit的,因此需要做修改:

image.png

可以留下邮箱,提供代码参考。


您好,您留个邮箱,给您发发现所有服务的参考代码。


问题已经找到了,谢谢!还有个问题就是CH579M SWD调试必须先用WCHISP软件设置使能"两线仿真"么?因为我手头的板子是没有USB口的,没法使用WCHISP软件,如果我需要仿真该怎么办?


代码调试期间,启用两线仿真需要在上位机进原厂boot后操作。您板子上有接出UART1和PB22吗吗,使用UART1接口也可以进boot,PB22接GND同时串口4根线一起接上,再点击启用两线仿真,也可以成功(串口识别BOOT不会有提示)。启用SWD会提示有代码泄漏风险,代码调试完毕批量生产后不建议启用。


我这边还遇到一个问题,CH579M为主机可以和CH579M的蓝牙模块(从机)进行通讯,读写都正常.但是和BLUENRG1芯片的蓝牙模块没法通讯,服务特性搜索如下image.png,当写入数据时提示Write Error :3,手机搜索BLUENRG1模块如下image.png,手机可以正常和BLUENRG1模块通讯。请问我这边出错 的原因是什么,谢谢!


搜索代码如下:

static void centralGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
{
	uint8_t result;
//  attReadByTypeReq_t req;
	uint8_t i;
//	uint8_t *p_uuid;
//	uint8_t uuid_length;
  PRINT("centralGATTDiscoveryEvent\r\n");
  if ( centralDiscState == BLE_DISC_STATE_SVC )
  {		
    // Service found, store handles
    if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP && pMsg->msg.findByTypeValueRsp.numInfo > 0 )
    {
      centralSvcStartHdl = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
      centralSvcEndHdl = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
      
      // Display Profile Service handle range
      PRINT("Found Profile Service handle : %x ~ %x \n",centralSvcStartHdl,centralSvcEndHdl);

    }	
    // If procedure complete
    if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  && pMsg->hdr.status == bleProcedureComplete ) || ( pMsg->method == ATT_ERROR_RSP ) )
    {
      if ( centralSvcStartHdl != 0 )
      {
				centralDiscState = BLE_DISC_STATE_CHAR;
				result = GATT_DiscAllChars(centralConnHandle,centralSvcStartHdl,centralSvcEndHdl,centralTaskId);
				PRINT("GATT_DiscAllChars:%02x\r\n",result);
				iFindChar = 0;
      }
    }
	}
  else if ( centralDiscState == BLE_DISC_STATE_CHAR )
  {
		// Characteristic found, store handle
		if(pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0)
		{
			for(i = 0; i < pMsg->msg.readByTypeRsp.numPairs ; i++) 
			{
				//characteristic properties
				uint8_t char_properties = pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len * i + 2];
				uint16_t char_value_handle = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len * i+3], \
																		 pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len * i + 4]);
				//characteristic uuid length
				uint8_t char_uuid_length = pMsg->msg.readByGrpTypeRsp.len - 5;
				//uuid
				uint8_t *char_uuid = &(pMsg->msg.readByGrpTypeRsp.pDataList[pMsg->msg.readByGrpTypeRsp.len * i + 5]);

				PRINT("char_properties  :%02x,%s\r\n",char_properties,(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP))?"wite handle":"");
				PRINT("char_value_handle:%04x\r\n",char_value_handle);
				PRINT("char_uuid_length :%02d\r\n",char_uuid_length);
				PRINT("char_uuid        :");
				hex_dump(char_uuid,char_uuid_length);
				if(char_properties&GATT_PROP_NOTIFY) 
				{
					centralCCCDHdl = char_value_handle+1;
					PRINT("notify handle:%04x\r\n",centralCCCDHdl);
					iFindChar |= (1<<0);
			  }
				else if(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP)) 
				{
					centralCharHdl = char_value_handle;
					PRINT("wtite handle:%04x\r\n",char_value_handle);
					iFindChar |= (1<<1);		
				}				
//                if(char_properties&GATT_PROP_INDICATE) {
//                    centralCCCDHdl = char_value_handle+1;
//                    PRINT("notify handle2:%04x\r\n",char_value_handle);
//                    tmos_start_task(centralTaskId, START_WRITE_CCCD_EVT, 800);
//               }
			}
		}  
		if((iFindChar &0x03) == 0x03)
  		centralDiscState = BLE_DISC_STATE_CCCD;	
	}
  else if ( centralDiscState == BLE_DISC_STATE_CCCD )
	{
		if ( pMsg->method == ATT_READ_BY_TYPE_RSP) 
		{
			PRINT("Found client characteristic configuration handle : %x \n",centralCCCDHdl);
			central_enbale_notify(centralConnHandle,centralCCCDHdl);
			tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, 1600);
			centralProcedureInProgress = FALSE;
			centralDoWrite =true;						
			centralDiscState = BLE_DISC_STATE_IDLE;
		}
	}		
}



在建立连接成功之后,可以直接根据handle值进行通信:

image.png

image.png


这个例程可以发我邮箱么,谢谢!个人信息保护,已隐藏


已发送至邮箱,请查收。

这里的类型如果是write no response,则做如下修改:

1.png


只有登录才能回复,可以选择微信账号登录