将字符串作为 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 个数据:
- 原始数据(char* 非 NULL 终止)
- 数据长度
你应该用 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/
我正在开发一个与蓝牙模块通信的移动应用程序。我正在通过 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 个数据:
- 原始数据(char* 非 NULL 终止)
- 数据长度
你应该用 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/