我正在写一个C应用程序的乌藨子皮科W利用BTstack库.我有一个特征,指向一个2 KB的数据缓冲区.当客户端设备发出信号准备好这些数据时,我目前只收到几百个字节要发送到客户端.基于我能找到的所有示例,这是我拥有的每当读取发生时都会触发的代码:

uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size) {
    UNUSED(connection_handle);

    if (att_handle == ATT_CHARACTERISTIC_ORG_QT_CHARACTERISTIC_HEARTBEAT_COVERAGE_01_VALUE_HANDLE) {
        
        return att_read_callback_handle_blob((const uint8_t *)&coverage_buffer, sizeof(coverage_buffer), offset, buffer, buffer_size);
    }
    return 0;
}

我在调用att_read_callback_handle_blob()之前添加了一些print语句,我可以看到,当BT堆栈try 发送整个包时,att_read_callback被调用了无数次.然而,我没有发送全部2000个字节,而是只收到了大约750个字节.

推荐答案

正如Martin jn van Welie提到的,每次BLE读取只能发送有限数量的字节,并且为了读取整个远程特征值,这应该在多次读取try 中完成.从您共享的代码中,有一个offset参数指定了您想要读取的数据的开始.根据您每次操作读取的数据量(例如,每个读取操作返回240字节的数据),您需要执行多次读取才能读取全部2KB的数据(即,对于第二次读取try ,偏移量应为241,然后对于第三次读取try ,偏移量需要为482,依此类推).

请注意,您不能/不应该快速连续读取数据.对于所有读取try ,您必须首先等待前一次读取try 完成,然后再进行新的读取try .在您的例子中,这意味着在进行新的读取try 之前,您需要等待处理程序启动(attReadCallback()).

C++相关问答推荐

获取二维数组的最大元素

rSP堆栈指针在返回函数调用的值时有任何用途吗?

带双指针的2D数组

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

C:scanf(%d&q;,...)输入只有一个减号

堆栈帧和值指针

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

如何用C语言为CLI应用程序编写按键检测系统?

pthread_create的用法

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

如何在C宏定义中包含双引号?

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

为什么二进制文件的大小不会随着静态数据的大小而增加?

try 查找带有指针的数组的最小值和最大值

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

如何用用户输入的多个字符串填充数组?

C语言程序流程解释

文件指针引起的C程序分段错误