我目前正在尝试使用Bluesmirf模块从Arduino获取数据到Android。
这是我的Arduino密码。
void setup() {
Serial.begin(115200);
}
void loop() {
if(Serial.available()){
char val = Serial.read();
if(val == '.'){
Serial.println("t1|x1|x2|x3|x4");
}
}
}正如你所看到的,我只是让它写一个长的字符串。最终,字符串将包含值。如果我向arduino写入句点,它将返回这些值。下面是我的蓝牙代码,它非常类似于蓝牙聊天示例中的代码:
private class ConnectedThread extends Thread{
private BluetoothSocket mmSocket;
private InputStream mmInStream;
private OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
// TODO Auto-generated constructor stub
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (Exception e) {
// TODO: handle exception
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run(){
byte[] buffer = new byte[1024];
int bytes;
while(true){
try {
// Garbage collector necessary to prevent data loss
System.gc();
bytes = mmInStream.read(buffer);
Log.d("Value of Output", new String(buffer, 0, bytes))
} catch (IOException e) {
e.printStackTrace();
connectionLost();
}
}
}
public void write(byte[] buffer){
try{
mmOutStream.write(buffer);
} catch(IOException e){
Log.d("Write", "failed");
}
}
public void cancel(){
if (mmInStream != null) {
try{mmInStream.close();}catch(Exception e){}
mmInStream = null;
}
if (mmOutStream != null) {
try{mmOutStream.close();} catch(Exception e){}
mmOutStream = null;
}
if (mmSocket != null) {
try{mmSocket.close();}catch(Exception e){}
mmSocket = null;
}
}
}我想提几件事。System.gc()的存在是因为如果我不把它放在那里,我有时会得到错误的数据。有时数据是丢失的,有时是重复的。
我遇到的问题是输出以多行的形式返回。所以在我的日志里我会发现
输出的值T1,x1,x1,x
输出的值2,x3,x4
而不是一条条线。当我通过蓝牙(蓝牙)将arduino连接到计算机上时,数据会以一条线返回。如何确保数据以一行的形式返回。
发布于 2013-08-23 09:47:35
井。我也有过同样的问题。为了解决这个问题,我使用了mDinput = new DataInputStream(mmInStream);,然后使用了mDinput.readFully(dateBuffer, 0, sizeYouWant);。然后,只有在缓冲区已满时,readFully才会返回缓冲区。
希望这能有所帮助
发布于 2013-08-22 07:31:43
我可以尝试将您的数据连接到一个“缓冲区”中,并检查这个缓冲区中的新行/回车字符。一旦找到数据,就可以将数据发送到实际变量,清除缓冲区,然后重新启动。这应该能起作用。
希望能有所帮助!)
https://stackoverflow.com/questions/18367719
复制相似问题