我正在开发一款与蓝牙模块进行通信的移动应用。我正在通过Android应用程序发送数据&在BLE模块上接收它。
我正在使用cordova&用于Cordova的BLE中央插件可以从android与设备进行通信。
应用似乎工作正常,但Uint8缓冲区有问题。
关于APP部分:
我正在尝试发送字符串如下:
$url='http://beautifulbathrooms.tumblr.com/';
$query='//script[contains(@src,"jquery")]';
$args=array(
'http'=>array(
'method' => 'GET',
'header' => implode( "\n", array(
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Host: beautifulbathrooms.tumblr.com'
)
)
)
);
/* create the context */
$context=stream_context_create( $args );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->standalone=true;
$dom->preserveWhiteSpace=true;
$dom->strictErrorChecking=false;
$dom->substituteEntities=false;
$dom->recover=true;
$dom->formatOutput=false;
$dom->loadHTML( file_get_contents( $url, FILE_TEXT, $context ) );
libxml_clear_errors();
$xp=new DOMXPath( $dom );
$col=$xp->query( $query );
if( !empty( $col ) ){
foreach( $col as $script ) echo $script->getAttribute('src').BR;
}
在我最终将数据发送到BLE设备之前,我正在使用以下函数将字符串转换为数组缓冲区
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);
现在这个工作正常,但后来当我发送字符串时如下
void SimbleeBLE_onReceive(char *data, int len) {
Serial.print(data); //prints 'action/523';
}
它只是替换整数&amp;的第一个数字。追加前一个整数值3 [23] var data : 'action/3';
每当我尝试先发送2位或更多位数值,然后再发送较小位数值
时,就会发生这种情况为什么这样?有什么缓冲区缓存吗?
答案 0 :(得分:1)
在您的部分,看起来您正在接收2个数据:
你应该NULL终止你收到的字符串
void SimbleeBLE_onReceive(char *data, int len)
{
char tmp[256]={0};
strncpy(tmp,data,min(len,sizeof(tmp)-1));
Serial.print(tmp);
}
这样,在第二次通话时,您应该看到操作/ 3 而不是操作/ 323 /