首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android蓝牙Arduino

Android蓝牙Arduino
EN

Stack Overflow用户
提问于 2013-08-21 21:07:22
回答 2查看 1.7K关注 0票数 0

我目前正在尝试使用Bluesmirf模块从Arduino获取数据到Android。

这是我的Arduino密码。

代码语言:javascript
复制
void setup() {

 Serial.begin(115200);

}
void loop() {
   if(Serial.available()){
    char val = Serial.read();
    if(val == '.'){
          Serial.println("t1|x1|x2|x3|x4");
   } 
  }
 }

正如你所看到的,我只是让它写一个长的字符串。最终,字符串将包含值。如果我向arduino写入句点,它将返回这些值。下面是我的蓝牙代码,它非常类似于蓝牙聊天示例中的代码:

代码语言:javascript
复制
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连接到计算机上时,数据会以一条线返回。如何确保数据以一行的形式返回。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-23 09:47:35

井。我也有过同样的问题。为了解决这个问题,我使用了mDinput = new DataInputStream(mmInStream);,然后使用了mDinput.readFully(dateBuffer, 0, sizeYouWant);。然后,只有在缓冲区已满时,readFully才会返回缓冲区。

希望这能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 07:31:43

我可以尝试将您的数据连接到一个“缓冲区”中,并检查这个缓冲区中的新行/回车字符。一旦找到数据,就可以将数据发送到实际变量,清除缓冲区,然后重新启动。这应该能起作用。

希望能有所帮助!)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18367719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档