2013-02-15 189 views
1

链接成功建立并能够发送数据。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()将数据写入SocketOutputStream

问题是与数据的格式。如果我发送'25'arduino正在接收'2','5'当我做Serial.read()

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

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

回答

1

arduinoboard似乎逐字节读取RX-Stream字节。如果发送“25”,它将传送字符'2'(这是0x32/decimal 50)的ascii字节,然后传送字符'5'的ascii表示(即0x35/decimal 53)。 arduino将这些数字解释为字符。所以,如果你想发送的数量比256下,你可以这样做: 在Android上:

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

为了确保Arduino的解释是正确的,使用接收到的字符作为一个短期,而不是作为一个字符。

希望这有助于

+0

Erhm,'int currVal = valueOf(progress);'会做什么?你指的是哪个'valueOf'?你想通过在线路上发送一个未初始化的数组'currVal'来实现什么? – 2013-02-16 11:49:43

+1

我很抱歉。我昨天一定很累,^^对不起这个废话。我编辑了它是正确的代码。对不起,O.O – 2013-02-16 13:34:08

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(); 

eers,

1

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

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

注意getBytes()构造可以完全分解,如果在Android端的字符集默认的编码变化。在不同的Android设备上,getBytes()可能返回unicode字符集编码,Arduino将无法解码。

+0

如果我只发送一些标准字符如'0-9',',','\ 0',unicode字符不会成为问题。这些字符的ascii值在android和arduino双方都是一样的吗? – tez 2013-02-16 20:29:03

+0

不是。如果没有明确的编码,getBytes()将使用JVM默认字符编码。该默认值取决于平台,因此您的程序可能处于风险之中。要看到这一点,如果使用参数-Dfile.encoding =“UTF-16”运行JVM,getBytes()将不会为每个字符返回一个字节。 – jdr5ca 2013-02-17 05:52:52

+0

是的,但现在这个问题。我已经完成了我的应用程序,我不明白为什么我得到正确的结果。如果我从Android发送“10”,我猜数据是'1'后来'0'。我认为每个字符在android结束时都是2个字节。但是我在arduino端使用了readBytesUntil()函数。技术上这应该在arduino端输出错误的结果。但是我得到了正确的值。发生了什么? – tez 2013-02-21 18:01:17