这个是我把接收到的ArrayBuffer转为可显示中文的字符串的函数:
arrayBufferToString(arr){
if(typeof arr === 'string') {
return arr;
}
var dataview=new DataView(arr);
var ints=new Uint8Array(arr.byteLength);
for(var i=0;i<ints.length;i++){
ints[i]=dataview.getUint8(i);
}
arr=ints;
var str = '',_arr = arr;
for(var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if(v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for(var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
},
这个是我监听消息的函数
listenValueChange() {
let that = this
uni.onBLECharacteristicValueChange(res => {
let result = that.arrayBufferToString(res.value)
//因为BLE蓝牙一次只能接收20个字节,所以我分段传输了一个大概1000字节的字符串,是一个echarts绘图的示例,在附件page.txt里,recmessage是我用来接收分割出的单个数据的变量
that.recmessage = String(result)
//message是我用来和文本框绑定显示数据的变量
that.message = that.message.concat(that.recmessage)
console.log(String(result),'000000')
})
},
现在有一个很有意思的问题,分割出的数据其他都能正常显示,但是data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]\r\n"中的 ["衬衫","羊毛衫","雪纺衫","裤子"(这一部分开头有个空格)这一部分只能显示最后面那个双引号,前面的所有内容包括引号和中括号都显示不出来,如果把这部分开头的空格去掉,就只显示到羊毛衫,就这句有问题,这部分单独拿出来传输也是一样的问题,但是把这一整句从data开始单独拿出来传输就没问题。
我可以确定两点,1.不是我下位机分割或者发送字符串的问题,因为我买蓝牙模块店家给我了一个配套的调试APP,在那个APP里我可以正常显示所有内容。2.不是没接收到这句话前面的内容,因为我ArrayBuffer转hex转ascii码后显示虽然中文是乱码,但是这句话引号和内容的数量是能对应上的