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

时间:2017-01-14 07:44:18

标签: javascript c arduino buffer uint8t

我正在开发一款与蓝牙模块进行通信的移动应用。我正在通过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位或更多位数值,然后再发送较小位数值

时,就会发生这种情况

为什么这样?有什么缓冲区缓存吗?

1 个答案:

答案 0 :(得分:1)

在您的部分,看起来您正在接收2个数据:

  1. 原始数据(char * 非NULL终止
  2. 数据长度
  3. 你应该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 /