Android / Arduino蓝牙通讯

时间:2013-02-15 11:36:11

标签: java android arduino

链接已成功建立并能够发送数据。

Android会在我们更改时发送SeekBar数据。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if(seekBar.getId() == R.id.seekBar)
    {
        speed.setText(String.valueOf(progress));
        String outputData = String.valueOf(progress);
        streams.write(outputData.getBytes());
    }
}

streams.write()将数据写入OutputStream的{​​{1}}。

问题在于数据的格式。如果我发送' 25' arduino正在接收' 2' 5'当我做Socket时。

Serial.read()转换为字节时,数据的格式是什么?一切都是outputData终止的吗?

我需要检索整数而不是单个数字。

3 个答案:

答案 0 :(得分:1)

arduinoboard似乎逐字节地读取RX-Stream。如果发送“25”,则发送字符'2'的ascii字节(0x32 /十进制50),然后发送字符'5'的ascii表示(即0x35 /十进制53)。 arduino将这些数字解释为字符。因此,如果您要传输的号码低于256,您可以: 在Android上:

if(seekBar.getId() == R.id.seekBar)
    {
        speed.setText(String.valueOf(progress));
        if(progress<256)
            streams.write((byte)progress);
    }

为了确保Arduino正确解释它,请将收到的字符用作短字而不是字符。

希望这有帮助

答案 1 :(得分:1)

对于发送方,getBytes()不返回带有空终止符的C字符串。在Java中,数组包含有关其长度的信息。所以byte []包含它的长度;它不像C char [],它使用null来表示数组的结尾。如果要翻译出站数据,您需要自己添加终结符:

String outputData = String.valueOf(progress);
streams.write(outputData.getBytes());
streams.write('\0');

请注意,如果字符集默认编码在Android端发生更改,则getBytes()可以完全分解。在不同的Android设备上,getBytes()可以返回unicode字符集编码,Arduino无法解码。

答案 2 :(得分:0)

你有一个int,将它转换为字符串并发送字符串:

 String outputData = String.valueOf(progress);
 streams.write(outputData.getBytes());

sending the int

streams.write( progress );

在Arduino端Serial.read()一次读取一个字节,所以(假设线上有大的字节)你可以做

int incomingByte = Serial.read();
incomingByte <<= 8;
incomingByte |= Serial.read();

干杯,