完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
相关推荐
39 个讨论
|
|
|
Hi Yan, 关于CHAR4句柄获得问题,我将例程中static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )函数中的SIMPLEPROFILE_CHAR1_UUID替换为SIMPLEPROFILE_CHAR4_UUID,但是下载到开发板上,设备根本无法发现服务,无法获得CHAR4的UUID. 问题出在哪呢?代码如下,红色部分是被我修改的地方。 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_CHAR; 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); req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR4_UUID); req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR4_UUID); GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId ); ] ] ] else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR ) [ // Characteristic found, store handle if ( pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0 ) [ /*simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0], pMsg->msg.readByTypeRsp.dataList[1] );*/ simpleBLECharHd4 = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0], pMsg->msg.readByTypeRsp.dataList[1] ); LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_1 ); simpleBLEProcedureInProgress = FALSE; ] simpleBLEDiscState = BLE_DISC_STATE_IDLE; ] ] |
|
|
|
|
|
|
|
|
Hi xie,
不好意思, 要读这几个char 还有几个地方要改. GATT_ReadUsingCharUUID() 需要read 属性支持. 加上read // Simple Profile Characteristic 3 Properties static uint8 simpleProfileChar3Props = GATT_PROP_WRITE; //只有write, 没有read // Simple Profile Characteristic 4 Properties static uint8 simpleProfileChar4Props = GATT_PROP_NOTIFY; //只有notiry, 没有read char 5 则是因为被定义为 需要鉴权参能读它 // Characteristic Value 5 [ [ ATT_BT_UUID_SIZE, simpleProfilechar5UUID ], GATT_PERMIT_AUTHEN_READ, 0, simpleProfileChar5 ], |
|
|
|
|
|
|
|
|
Hi Yan,
我发现这个simpleProfileAttrTbl[]数组只在simpleBLEPeripheral例程中有定义。那么当我们在simpleBLEcenter里要用到CHAR4的句柄时,我们是不是只能间接获得CHAR4的句柄?比如在线调试simpleBLEPeripheral程序在IAR里面通过 simpleProfileAttrTbl[ char4_val_idx ]. handle 来得到hanle 的值,或者通过BTool获得CHAR4的句柄,然后再用到simpleBLEcenter程序中使能notification吗? |
|
|
|
|
|
|
|
|
原来我漏掉了一个权限,把这个加上就可以读出CHAR 4的特征值的地址了。
// Characteristic Value 4 [ [ ATT_BT_UUID_SIZE, simpleProfilechar4UUID ], GATT_PERMIT_READ | GATT_PERMIT_WRITE, //本来是0的,自己加上读写权限 0, &simpleProfileChar4 ], 要想读出CHAR 4需要设置两个地方的权限: 1、 // Simple Profile Characteristic 4 Properties static uint8 simpleProfileChar4Props = GATT_PROP_READ | GATT_PROP_NOTIFY; //增加GATT_PROP_READ 2、属性表中 // Characteristic Value 4 [ [ ATT_BT_UUID_SIZE, simpleProfilechar4UUID ], GATT_PERMIT_READ | GATT_PERMIT_WRITE, //本来是0的,自己加上读写权限 0, &simpleProfileChar4 ], 论坛给我了指导,也希望能够帮助大家 |
|
|
|
|
|
|
|
骑猪去天山 发表于 2020-3-10 16:37 嗨 Yan,首先我是自己建立另外一个特征值char8,长度15;我按着你这个例程对特征值通知开通了,主机中开通通知代码如下 if( keys & HAL_KEY_SW_1 ) [ //使能char8通知 attWriteReq_t attReq; uint8 pValue[2]; attReq.handle = 0x0040; //这里我用的是btool软件Read/Write功能发现特征值功能,发现char8的句柄是0x003f,然后handle+1 =0x0040 attReq.len = 2; attReq.sig = 0; attReq.cmd = 0; pValue[0] = LO_UINT16( GATT_CLIENT_CFG_NOTIFY ); //0X01 pValue[1] = HI_UINT16( GATT_CLIENT_CFG_NOTIFY ); //0X00 osal_memcpy( attReq.value, pValue, 2 ); GATT_WriteCharValue( simpleBLEConnHandle, &attReq, simpleBLETaskId ); NPI_WriteTransport( "Notification enabled", osal_strlen("Notification enabled") ); ] 但是我并不知道从机是否相应的给我开通了通知;然后我从peripheral串口助手发送一串字符,在串口回调函数中对从串口接收到的数据更新特征值8的值, 从机中串口代码如下 static void NpiSerialCallback(uint8 port ,uint8 events )[ (void)port; uint8 numBytes=0; uint8 buf[128]; if(events & HAL_UART_RX_TIMEOUT) //串口有数据, [ numBytes=NPI_RxBufLen(); //读出串口有多少数据 if(numBytes) [ if(numBytes >= SIMPLEPROFILE_CHAR8_LEN ) buf[0] = SIMPLEPROFILE_CHAR8_LEN -1; else buf[0] = numBytes; //从串口缓冲区读出nuBytes个字节数据 NPI_ReadTransport( &buf[1], buf[0] ); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR8, SIMPLEPROFILE_CHAR8_LEN, buf); //把接收到的数据在打印出来 //NPI_WriteTransport(buf,numBytes); ] ]]现在的问题是,我从串口发送一串字符过去,主机那边不能进入这个simpleBLECentralProcessGATTMsg消息处理函数中。 其中我对通知的处理代码如下: else if( pMsg->method == ATT_HANDLE_VALUE_NOTI ) [ //串口打印char8通知,由从机通知过来char8的值 if(pMsg->msg.handleValueNoti.handle == 0x003F ) [ if( pMsg->msg.handleValueNoti.value[0] >= 15 ) [ NPI_WriteTransport( &pMsg->msg.handleValueNoti.value[1], 14 ); NPI_WriteTransport("....n", 5); ] else [ NPI_WriteTransport( &pMsg->msg.handleValueNoti.value[1], pMsg->msg.handleValueNoti.value[0] ); ] ] ]谢谢Yan的关注,我叫CQ_JIMI |
|
|
|
|
|
|
|
sagffag 发表于 2020-3-10 23:05 我是直接从表里读的:pReport.handle = simpleProfileAttrTbl[11].handle;//读取notification对应的handle |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
550 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1514 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1338 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1759浏览 29评论
2786浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1726浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1636浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1647浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 21:14 , Processed in 1.095220 second(s), Total 75, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2307