我有一个设备不断广播蓝牙编码 PHY (125kbps)扩展广播和蓝牙4广播、我确信它功能正常。 我正在尝试对 LP-CC2652RB 进行编程、以扫描此器件广播的编码 Phy 扩展广播广播广播、并通过串行终端打印扩展广播数据的二进制位。 不过、该行为不符合预期。
我将从为 LP-CC2652RB 制作的 simple_central 示例代码开始。 我添加了 以下 代码、以便能够打印扩展广播数据的位: #define bit_to_array_size 和函数 get_bit 帮助打印广播数据的各个位、然后我在 SC_EVT_ADV_REPORT 下插入了剩余代码、以将广播数据存储在 char 数组中并打印到串行终端:
/* * Helper function and definition for SimpleCentral_processAppMsg that helps print the advertising data 1 bit at a time * * source: www.sanfoundry.com/.../ */ #define BIT_TO_ARRAY_SIZE(x) (x/8+(!!(x%8))) // convert from number of bits to number of chars char get_bit(char *array, int index) { return 1 & (array[index / 8] >> (index % 8)); } // TEST PRINTING ADVERTISING DATA uint8_t *adv_data_pointer = pAdvRpt->pData; uint16_t adv_len = pAdvRpt->dataLen; // in bits char adv_data[BIT_TO_ARRAY_SIZE(adv_len)]; // initialize char array to hold raw bits of advertising data // THIS LINE BELOW IS CAUSING ERROR pAdvRpt->pData = &adv_data[0]; Display_printf(dispHandle, SC_ROW_AC+1, 0, "ADVERTISING DATA LENGTH: %i", adv_len); for(int loop = 0; loop < adv_len; loop++) { Display_printf(dispHandle, SC_ROW_AC+3+loop, 0, "ADVERTISING DATA %d: %d", loop, get_bit(adv_data, loop)); // print hex characters } // Delays n*10 microseconds Task_sleep(100000*10/Clock_tickPeriod);
运行代码时、串行终端允许我选择扫描 PHY。 如果我选择要编码的扫描 PHY、即使旁边有广播器件、它也绝不会检测到任何器件。 如果我选择扫描 PHY 为1Mbps、则能够检测到设备、但 打印的"广播数据长度"始终很小(从0到31、根据我目前所见)、 串行终端中打印的各个位似乎是荒谬的;即使广播数据长度发生变化、也会针对检测到的不同器件打印完全相同的位。 通常、最后打印出来的10-20位也为0。
代码的另一个问题是、在检测到2个或3个器件后、程序总是生成错误并且串行终端冻结。 我不确定我的代码为什么会导致这种情况。
我还想问、 GapScan_Evt_AdvRpt_t 结构-> dataLen 的单位是什么? (即位、字节?)
此外、以下是我要尝试扫描的主广播帧和扩展广播帧的确切位编码:
有人对如何编写能够执行我需要的功能的代码有什么建议吗?
如果我能快速获得一些帮助、那就太好了。 谢谢你。
