将字符串作为 Uint8 缓冲区发送

Sending string as Uint8 buffer

我正在开发一个与蓝牙模块通信的移动应用程序。我正在通过 android 应用程序发送数据并在 BLE 模块上接收数据。

我正在使用 cordova 和 Cordova 的 BLE 中央插件与来自 android 的设备进行通信。

应用程序似乎运行良好,但 Uint8 缓冲区有问题。

关于应用程序部分:

我正在尝试发送如下字符串:

var data : 'action/523';

在我最终将数据发送到 BLE 设备之前,我正在使用以下函数将字符串转换为数组缓冲区

function stringToArrayBuffer(str) {
    // assuming 8 bit bytes
    var ret = new Uint8Array(str.length);
    for (var i = 0; i < str.length; i++) {
        ret[i] = str.charCodeAt(i);
    }
    return ret.buffer;
}

var data = stringToArrayBuffer(data);
ble.writeWithoutResponse(app.connectedPeripheral.id, SERVICE_UUID, WRITE_UUID, data, success, failure);

关于设备部分:

我正在使用一个简单的设备特定函数来接收 BLE 设备上的数据,如下所示

void SimbleeBLE_onReceive(char *data, int len) {
     Serial.print(data); //prints 'action/523';
}

现在这工作正常,但稍后当我按如下方式发送字符串时

var data : 'action/3';

它只是替换整数的第一位数字并附加前一个整数值 3[23] 'action/323/';

每次我尝试先发送 2 个或更多数字值,然后再发送更小的数字值时,都会发生这种情况

为什么会这样?是否有缓冲区缓存之类的东西?

在您的设备上,您似乎收到了 2 个数据:

  1. 原始数据(char* 非 NULL 终止
  2. 数据长度

你应该用 NULL 终止你收到的字符串

void SimbleeBLE_onReceive(char *data, int len)
{       
    char tmp[256]={0};
    strncpy(tmp,data,min(len,sizeof(tmp)-1));
    Serial.print(tmp);
}

这样,在您第二次调用时,您应该看到 action/3 而不是 action/323/