Part Number:CC2340R5
求助,关于从CC2642蓝牙模块移植主机程序到CC2340上面,在获取GAP_ADTYPE_LOCAL_NAME_COMPLETE时,时而收到的时广播数据,时而收到的是广播响应数据,二者不能同时接收,导致无法正确的获取从机的蓝牙名,扫描结果如图,
Cherry VIP:
bleStk_GapScan_Evt_AdvRpt_t* pAdvRpt =&scanMsg->pBuf->pAdvReport;for(i=0;i<pAdvRpt->dataLen;i++){printf("%02x",pAdvRpt->pData[i]);}打印的是这个
,
Galaxy Yue:
您好,您的问题在跟进,需要一些时间,谢谢。
,
Cherry VIP:
好的,非常感谢,上面的代码在在CC2642上是完整的,数据如下
02 01 06 12 09 5a 68 65 4c 69 32 30 32 31 30 39 32 38 32 32 37 38ZheLi202109282278 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 32 35 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 32 35SmartNose-2F925 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 31 36 00 00 00 00 02 01 1a 02 0a 0c 0b ff 4c 00 10 06 3e 1e be 3e 08 96 02 01 1a 02 0a 08 0a ff 4c 00 10 05 28 18 7d e8 c6 02 01 1a 02 0a 07 0c ff 4c 00 10 07 31 1b f3 b1 d6 32 38 02 01 06 03 02 e5 ff 11 ff 37 43 45 32 36 39 39 45 37 46 46 38 00 00 00 00 10 09 54 76 34 31 30 75 2d 36 39 39 45 37 46 46 38 05 12 06 00 18 00 02 0a 00 00Tv410u-699E7FF8 02 01 06 1b ff 57 01 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 02 e9 33 33 28 36 5e 10 09 4d 69 20 53 6d 61 72 74 20 42 61 6e 64 20 35 03 02 e0 fe Mi Smart Band 5 02 01 1a 03 03 92 fd 02 01 1a 02 0a 07 0c ff 4c 00 10 07 35 1b bb 96 e5 4f 48 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 30 45 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 30 45SmartNose-2F90E 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 31 30 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 31 30SmartNose-2F910 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 30 46 00 00 00 00 02 01 06 03 02 e5 ff 11 ff 35 34 30 46 35 37 34 34 32 32 44 34 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 34 32 32 44 34 SmartNose-422D4 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 31 45 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 31 45 SmartNose-2F91E 02 01 02 09 ff 00 00 00 15 81 ce c2 29 11 07 55 e4 05 d2 af 9f a9 8f e5 4a 7d fe 43 53 53 49TM:08OK
,
Galaxy Yue:
您好,
请帮助我解决以下问题:
请确认您使用的SDK版本是什么? 您是否正在使用特定的示例项目,例如basic_ble? 如果是这种情况,并且您正在使用app_central.c,那么您在代码中的哪个位置读取pAdvReport? 您是否正在考虑特定的外设,此外设是否同时在Adv数据和扫描响应数据中通告本地名称(您可以在syscfg文件中检查该名称)?
,
Cherry VIP:
好的,
1.我下载的SDK版本有simplelink_lowpower_f3_sdk_7_10_00_35和simplelink_lowpower_f3_sdk_7_20_00_29,但是我不清楚目前使用的是哪一个版本,请问我该在哪里查看我目前使用的SDK版本。
2.是的,我目前使用的basic_ble示例项目。
3.我读取pAdvReport的位置为 void Central_ScanEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData) -> case BLEAPPUTIL_ADV_REPORT:
,可以查看我下面的附的代码。
static bool Get_Adtype_Data( uint8 adType, uint8 *pData, uint8 dataLen, uint16 *adTypeData_index, uint16 *adTypeData_len) {(void)adTypeData_index;//防止编译报错(void)adTypeData_len;//防止编译报错uint8 adLen;//对应数据段的长度uint8 *pCurrent;//当前位置的指针uint8 *pEnd;//尾指针int i;if(pData == NULL){my_dbg_printf("find null pointer\r\n",19);return false;}for(i=0; i<dataLen; i++){sprintf(printbuf,"%02x ",pData[i]);PRINT_LOG;}my_dbg_printf("\r\n",2);pEnd = pData + dataLen - 1;//指向包尾pCurrent = pData;//当前指针指向包头while ( pCurrent < pEnd )//判断当前指针是否还未到包尾{adLen = *pCurrent++;//获取本段数据段的长度if ( adLen > 0 ){if ( adType == *pCurrent )//如果找到了adType{*adTypeData_index = (pCurrent + 1) - pData;//数据段在数据包中的偏移值*adTypeData_len = adLen - 1;//数据段长度return TRUE;//返回TRUE}else//没找到adType则指向下一个数据段{pCurrent += adLen;}}}my_dbg_printf("FALSE\r\n",7);return FALSE;//本数据串中没有找到adType }void Central_ScanEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData) {BLEAppUtil_ScanEventData_t *scanMsg = (BLEAppUtil_ScanEventData_t *)pMsgData;case BLEAPPUTIL_ADV_REPORT:{bleStk_GapScan_Evt_AdvRpt_t *pScanRpt = &scanMsg->pBuf->pAdvReport;if (pScanRpt->pData != NULL){uint8_t indx = 0;for (; indx < pScanRpt->dataLen; indx++){//sprintf(printbuf,"pScanRpt->pData=%d\r\n",pScanRpt->pData[indx]);PRINT_LOG;MenuModule_printf(APP_MENU_SCAN_EVENT + indx, 0, "Data: %d", pScanRpt->pData[indx]);}}#if !Changeuint8 size = Scan_getScanResList(&menuScanRes);uint8 scannum[2];scannum[1] = size%10 + 0x30;scannum[0] = size/10 + 0x30;bleStk_GapScan_Evt_AdvRpt_t* pAdvRpt = &scanMsg->pBuf->pAdvReport;uint16 adTypeData_index = 0;uint16 adTypeData_len = 0;bool status = FALSE;uint8 deviceInfo[40] = {0x00};sprintf(printbuf,"evtType=%d\r\n",pAdvRpt->evtType);PRINT_LOG;status = Get_Adtype_Data( GAP_ADTYPE_LOCAL_NAME_COMPLETE,pAdvRpt->pData,pAdvRpt->dataLen,&adTypeData_index,&adTypeData_len);if(status == TRUE){memset(deviceInfo, 0, sizeof(deviceInfo));memcpy(deviceInfo,pAdvRpt->pData + adTypeData_index,adTypeData_len);//status = addScanInfo(pAdvRpt->addr,pAdvRpt->addrType);status = Central_addScanRes(&pAdvRpt);if(status == TRUE){SerialSendSimple(deviceInfo,strlen(deviceInfo));SerialSendSimple("\r\n",2);}my_dbg_printf("--------------------\r\n",22);}my_dbg_printf("==========\r\n",12);// Free report payload data释放报告有效负载数据 //if (pAdvRpt->pData != NULL) //{ //ICall_free(pAdvRpt->pData); //} #endifbreak;} }4.是的,我使用的外设中在扫描响应和广播数据中都有完整的本地名称。
uint8_t advertData[] = {0x02,// length of this dataGAP_ADTYPE_FLAGS,GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL,// service UUID, to notify central devices what services are included// in this peripheral0x03,// length of this dataGAP_ADTYPE_16BIT_MORE,// some of the UUID's, but not allLO_UINT16(0xffe5), HI_UINT16(0xffe5),0x11,GAP_ADTYPE_MANUFACTURER_SPECIFIC,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };uint8_t scanRspData[] = {// complete name0x11,// length of this dataGAP_ADTYPE_LOCAL_NAME_COMPLETE,'T','v','4','1','0','u','-', '0', '0', '0', '0', '0', '0', '0', '0', '\0',// connection interval range0x05,// length of this dataGAP_ADTYPE_PERIPHERAL_CONN_INTERVAL_RANGE,LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),// 100msHI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),// 1sHI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),// Tx power level0x02,// length of this dataGAP_ADTYPE_POWER_LEVEL,0// 0dBm };
,
Galaxy Yue:
您好,您在您的浏览器下载列表中或者是本地文件夹中可以打开查看此文件,然后命名中就会有SDK的版本号。
还有个较为麻烦的方法,您可以导入到CCS中,也会有显示。
,
Cherry VIP:
感谢,我查询到使用的SDK版本为simplelink_lowpower_f3_sdk_7_20_00_29。
,
Galaxy Yue:
好的,已经收到补充的信息,我会继续为您跟进。
,
Cherry VIP:
好的,请问跟进结果怎么样了
,
Galaxy Yue:
您好,此时,外围设备似乎只是发送本地名称作为扫描响应的一部分,这将解释您的串行数据屏幕截图中缺少的设备信息。 请启用完整的本地名称作为广告数据的一部分,如下所示:
,
Cherry VIP:
可是当我使用CC2642的时候能正常收到广播名。
,
Cherry VIP:
这是我使用CC2642扫描获取到的数据,里面包含了完整的广播数据和扫描响应数据,并且扫描其他BLE模块也能正常的获取完整的数据,但是在CC2340上面获取的数据并不完整。
可以看到数据中,上面的数据为广播数据和扫描响应数据,下面的是对应的广播名,我的特定设备是 Tv410u-699E7FF8 在这个CC2642上面可以看到完整的数据包。
1e ff 4c 00 12 19 39 16 75 27 90 22 d7 3d 1c 11 6b bd 42 95 ff 6f 29 40 12 4d ea 93 d4 00 61 02 01 06 12 09 5a 68 65 4c 69 32 30 32 31 30 39 32 38 32 32 37 38ZheLi202109282278 02 01 1a 02 0a 07 0c ff 4c 00 10 07 3b 1b 13 d6 46 d0 78 02 01 06 03 02 e5 ff 11 ff 37 43 45 32 36 39 39 45 37 46 46 38 00 00 00 00 11 09 54 76 34 31 30 75 2d 36 39 39 45 37 46 46 38 00 05 12 06 00 18 00 02 0a 00Tv410u-699E7FF8 02 01 1a 02 0a 0c 0a ff 4c 00 10 05 5b 1c 1d f8 a5 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 30 45 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 30 45SmartNose-2F90E 02 01 06 03 02 e5 ff 11 ff 35 34 30 46 35 37 34 34 32 32 44 34 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 34 32 32 44 34SmartNose-422D4 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 30 46 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 30 46SmartNose-2F90F 02 01 06 03 02 e5 ff 11 ff 36 38 30 41 45 32 34 32 46 39 32 35 00 00 00 00 05 12 f4 01 f4 01 02 0a 0a 10 09 53 6d 61 72 74 4e 6f 73 65 2d 32 46 39 32 35 SmartNose-2F925
,
Galaxy Yue:
您好, 可能是不同芯片的内部设置有所差别,目前已经跟进您的问题。
,
Cherry VIP:
好的,非常感谢。期待跟进结果。
,
Galaxy Yue:
好的,有消息会及时通知您的。
,
Galaxy Yue:
您好,
1.您能否与我分享您在 CC2642(作为中央设备)上运行的项目/示例,因为它与 CC2340 上运行的 basic_ble 不同。
2.您能否解释一下您在 basic_ble 项目上修改了什么,以尝试重现此行为?
3.CC2340 设备是否配置为进行被动扫描或主动扫描?
,
Cherry VIP:
好的,
1.CC2642上使用的是示例simple_central,SDK版本为simplelink_cc13xx_cc26xx_sdk_7_10_01_24。
2.没有进行项目修改,只是在app_central.c -> Central_ScanEventHandler ->case BLEAPPUTIL_ADV_REPORT: 中尝试读取蓝牙名,在打印MenuModule_printf(APP_MENU_SCAN_EVENT + indx, 0, "Data: %d", pScanRpt->pData[indx]); 时,发现广播数据和响应数据跟分开的,不像CC2642的是一个完整的包。
3.是的,CC2340主机配置为主动扫描
,
Galaxy Yue:
已收到您补充的信息,继续为您跟进。辛苦您的等候,有消息立即告诉您。
,
Galaxy Yue:
您好,
我建议比较两个项目功能:simple_central 与 basic_ble。 我也在这样做。
您能否分享一下如何使用 simple_central 项目打印扫描的报告值?
考虑到重复过滤器已禁用,运行 basic_ble 的设备可能正在接收重复的 adv 报告。
,
Cherry VIP:
好的,
static void SimpleCentral_processAppMsg(scEvt_t *pMsg) ->case SC_EVT_ADV_REPORT:-> GapScan_Evt_AdvRpt_t* pAdvRpt = (GapScan_Evt_AdvRpt_t*) (pMsg->pData);Get_Adtype_Data( GAP_ADTYPE_LOCAL_NAME_COMPLETE,pAdvRpt->pData,pAdvRpt->dataLen,&adTypeData_index,&adTypeData_len);static bool Get_Adtype_Data( uint8 adType, uint8 *pData, uint8 dataLen, uint16 *adTypeData_index, uint16 *adTypeData_len) {(void)adTypeData_index;//防止编译报错(void)adTypeData_len;//防止编译报错uint8 adLen;//对应数据段的长度uint8 *pCurrent;//当前位置的指针uint8 *pEnd;//尾指针int i;if(pData == NULL){//my_dbg_printf("find null pointer\r\n",19);return false;}for(i=0; i<dataLen; i++){sprintf(printbuf,"%02x ",pData[i]);PRINT_LOG;}pEnd = pData + dataLen - 1;//指向包尾pCurrent = pData;//当前指针指向包头while ( pCurrent < pEnd )//判断当前指针是否还未到包尾{adLen = *pCurrent++;//获取本段数据段的长度if ( adLen > 0 ){if ( adType == *pCurrent )//如果找到了adType{*adTypeData_index = (pCurrent + 1) - pData;//数据段在数据包中的偏移值*adTypeData_len = adLen - 1;//数据段长度return TRUE;//返回TRUE}else//没找到adType则指向下一个数据段{pCurrent += adLen;}}}return FALSE;//本数据串中没有找到adType }CC2642的扫描报告打印的地方跟CC2340是在一个地方。
,
Cherry VIP:
1.通过打印的报告,我发现广播数据和扫描响应是分开的,目前的处理是跳过广播数据,直接接收扫描响应数据来获取本地名。只是不明白为什么在CC2642上扫描到的广播数据和扫描响应是在一起的,而在CC2340上面扫描到的数据却是分开的。
2.请问有什么办法能增加central设备一次性发出数据字节大小吗?目前是一次性最多发20字节,超过20的部分会另作一个包重新发送。
,
Galaxy Yue:
您好,以下是开启重复过滤器的截图
信息已经同步,请您再耐心等候。
,
Galaxy Yue:
您好,
1.这可能是由于设备上运行的堆栈之间存在差异造成的。 我将进一步深入研究并与您分享我能找到的内容。2.我建议查看 CC2340 用户指南的“最大传输单元 (MTU)”部分。 默认最大大小为 23 字节,但使用 LE 数据长度扩展 (DLE) 功能,可以将 LE 数据包的长度设置为在连接期间传输最多 251 字节。
以下是DLE的链接
https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_7_20_00_29/docs/ble5stack/ble_user_guide/html/ble-stack-common/link-layer-cc23xx.html#le-data-length-extension
以下是MTU的链接
https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_7_20_00_29/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gatt-cc23xx.html?highlight=mtu#maximum-transmission-unit-mtu
,
Cherry VIP:
好的,非常感谢。
在主机与从机通信时,主机给从机发送长度大于20字节的字符串时,从机收到时包是分开的,就是20字节20字节的接收。但是从机发送给主机时,主机打印出来时却是一个完整的包。两个模块都是CC2340。数据如下图:左边的主机模块,右边的是从机模块
并且在syscfg中设置的PDU大小都是247字节,如图
,
Galaxy Yue:
好的,收到您补充的信息。继续为您跟进。
,
Galaxy Yue:
您好,
您正在使用 basic_ble 项目吗? 您能否分享有关在两台设备上运行的程序的更多详细信息?
我们还有一个 UART_over_ble 示例,值得一看。
RX 环形缓冲区大小是多少?
、
,
Cherry VIP:
是的,目前正在使用basic_ble项目,更多的详细信息是指什么?
RX和TX缓冲区,在主机和从机模块中设置的都是一样的,都是32
,
Galaxy Yue:
应该是说两台2340之间使用了哪些程序
,
Cherry VIP:
实现蓝牙透传,就只用到了串口和通知
,
Galaxy Yue:
好的,继续为您跟进。
,
Galaxy Yue:
通知具有应考虑的额外长度限制。 例如,要传输 100 字节的有效负载数据(默认 ATT_MTU = 23 字节),需要五个请求或响应过程。 我建议查看用户指南(特别是最大传输单元 (MTU) 部分)以获取有关此内容的更多详细信息。 通知是中央设备用来将数据写入外设的过程,这就是为什么只有在外设侧传输数据时才会看到这种行为。 外设很可能正在使用读/写请求过程。