1

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

每当我们更改它时,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.Socket

问题出在数据格式上。如果我发送'25' arduino 正在接收'2','5' Serial.read()

数据的格式是什么,什么时候outputData转换成字节?一切都由 终止\0吗?

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

4

3 回答 3

1

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

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

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

于 2013-02-16T19:44:44.163 回答
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 正确解释它,请将接收到的字符用作短字符而不是字符。

希望这可以帮助

于 2013-02-15T11:53:42.830 回答
0

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

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

发送 int怎么样:

streams.write( progress );

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

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

干杯,

于 2013-02-15T11:41:59.627 回答