This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-CC2652RB:尝试从蓝牙扫描读取扩展广播数据

Guru**** 2538950 points
Other Parts Discussed in Thread: LP-CC2652RB

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1222381/lp-cc2652rb-trying-to-read-extended-advertisement-data-from-bluetooth-scan

器件型号:LP-CC2652RB

我有一个设备不断广播蓝牙编码 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个器件后、程序总是生成错误并且串行终端冻结。 我不确定我的代码为什么会导致这种情况。

如果 syscfg 文件有帮助、我还将其作为附件:

我还想问、  GapScan_Evt_AdvRpt_t 结构-> dataLen 的单位是什么? (即位、字节?)

此外、以下是我要尝试扫描的主广播帧和扩展广播帧的确切位编码:

/resized-image/__size/320x240/__key/communityserver-discussions-components-files/538/pastedimage1683065836039v2.png

/resized-image/__size/320x240/__key/communityserver-discussions-components-files/538/pastedimage1683065911097v3.png

有人对如何编写能够执行我需要的功能的代码有什么建议吗?  

如果我能快速获得一些帮助、那就太好了。 谢谢你。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您与我们联系。 我们将查看您的问题、并尽快与您联系。 同时、您能否指定您正在使用的 SDK 版本?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SimpleLink CC13xx CC26xx SDK (6.41.00.17)

    非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Michael、您好!

    我要给大家的第一个答案是、Adv 报告结构中的数据长度大小为 uint_16

    https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_6_41_00_17/docs/ble5stack/ble_user_guide/doxygen/ble/html/struct_gap_scan___evt___adv_rpt__t.html

    [quote userid="560092" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1222381/lp-cc2652rb-trying-to-read-extended-advertisement-data-from-bluetooth-scan 代码中的另一个问题是、在检测到2个或3个器件后、程序总是产生错误并且串行终端冻结。 我不确定我的代码为什么会导致这种情况。

    它会引发什么错误代码? 这似乎是我们应该解决的第一个问题。

    此致、

    Rogelio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Rogelio、

    关于  GapScan_Evt_AdvRpt_t Struct -> dataLen、我不想问 dataLen 的数据类型是什么。 我的意思是问、 长度的单位是什么? 例如、如果 dataLen 等于10、这是否意味着 pData 的长度为10个字节? 还是10位呢? 或者什么?

    关于误差、这可能是由于我缺乏经验、但如何判断误差是什么呢? 控制台和 CCS 中的"Problems"选项卡都不显示任何内容。 当错误发生时、我看到的行为是:串行终端冻结、当我在 CCS 中停止程序时、我需要在这个无限循环内转到 Error.c 第128行:

        if (Error_policy_D == Error_SPIN) {
            for(;;) {
            }
        }

    我还链接了我的整个项目(GitHub);如果你能运行我的代码并复制错误、从而加速编译过程、我将不胜感激。

    github.com/.../LP-CC2652RB-BLE-LR-Scanner

    如果你能就原帖中的其他问题提供指导,也会很感激;我想尝试并行解决所有问题。

    谢谢你。