2

----------------------編集--------------------------
A少し進歩しましたが、解決策ではありません。送信したいコマンドの間に次のコードを挿入すると、少なくともコマンドはリモートエンドで処理する時間ができます(ただし、これはまだ正しい方法ではありませんが、正しい方法は待つことです別のコマンドを送信する前に応答">"の場合)..。

android.os.SystemClock.sleep(150);

ただし、システムクロックがスリープしている間はリスナースレッドがブロックされるため、モデムからの入力は、一連のコードが送信されるまでテキストビューに追加されません。これは、望ましいとは言えません。繰り返しになりますが、スリープはそれを行う正しい方法ではありません。より良い方法を見つける必要があるので、反対側のデバイスから「>」の結果が返されるまで新しいコマンドを送信しません。このコードを使い終わったら、どちらの方法でも入力を処理する方法が必要になるので、考えてみると睡眠は実際には進行していません。スリープを挿入する例:

    sendData("enable");
    android.os.SystemClock.sleep(150);
    sendData("password");        
    android.os.SystemClock.sleep(150); 
    sendData("conf t");        
    android.os.SystemClock.sleep(150);     
    sendData("interface eth0");        
    android.os.SystemClock.sleep(150);    
    //etc...etc...etc... 

----------------------以下の元の投稿------------------------- -

http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/にあるMattBellのブログからこのエレガントに書かれたコードを使用しています。

ここにあるソース:http: //project-greengiant.googlecode.com/svn/trunk/Blog/Android%20Arduino%20Bluetooth

コードをひどく切り刻むことなく、次のコマンドを送信する前に完全な応答が受信されるまで待つたびに、接続されたモデムにコマンドをシリアルにエレガントに送信する方法に適合しようとしています。(これはAndroidのやり方ではないことを私は知っています、そして私は他の言語を使ってこれをハートビートで扱うことができました)。

これが私がこれまで取り組んできたものです(実際、このコードは、最初のコマンドが完了するのを待ってからさらにコマンドを送信する必要がある時点まで、それほど遠くまでは機能していません)。この質問に関係のないコードをできるだけ省略しました。前もって感謝します。

    package Android.Arduino.Bluetooth;        

    import java.io.IOException;        
    import java.io.InputStream;        
    import java.io.OutputStream;        
    import java.util.Set;        
    import java.util.UUID;        
    import android.app.Activity;        
    import android.bluetooth.BluetoothAdapter;        
    import android.bluetooth.BluetoothDevice;        
    import android.bluetooth.BluetoothSocket;        
    import android.content.Intent;        
    import android.os.Bundle;        
    import android.os.Handler;        
    import android.widget.TextView;        


    public class BluetoothTest extends Activity        
    {        
        TextView myLabel;        
        BluetoothAdapter mBluetoothAdapter;        
        BluetoothSocket mmSocket;        
        BluetoothDevice mmDevice;        
        OutputStream mmOutputStream;        
        InputStream mmInputStream;        
        int counter;        
        Thread workerThread;        
        byte[] readBuffer;        
        int readBufferPosition;        
        volatile boolean stopWorker;        

        @Override        
        public void onCreate(Bundle savedInstanceState)        
        {        
            super.onCreate(savedInstanceState);        
            setContentView(R.layout.main);        

            myLabel = (TextView)findViewById(R.id.label);        

                        try         
                        {        
                            findBT();        
                            openBT();        
                            sendData("enable");        
                          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)
                            sendData("password");        
                          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)        
                            sendData("conf t");        
                          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)        
                            sendData("interface eth0");        
                          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)        
                          //etc...etc...etc...        
                        }        
                        catch (IOException ex) { }                            

        }        

        }        

        void openBT() throws IOException        
        {        
            UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard SerialPortService ID        
            mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);                
            mmSocket.connect();        
            mmOutputStream = mmSocket.getOutputStream();        
            mmInputStream = mmSocket.getInputStream();        
            beginListenForData();        
            myLabel.append("Bluetooth Opened" + "\n");        
        }        

        void beginListenForData()        
        {        
            final Handler handler = new Handler();         
            final byte delimiter = 62; //This is the ASCII code for a > character indicating all data received        

            stopWorker = false;        
            readBufferPosition = 0;        
            readBuffer = new byte[1024];              

            workerThread = new Thread(new Runnable()        
            {        
                public void run()        
                {                        

                while(!Thread.currentThread().isInterrupted() && !stopWorker)        
                   {        
                        try         
                        {        
                            int bytesAvailable = mmInputStream.available();                                
                            if(bytesAvailable > 0)        
                            {        
                                byte[] packetBytes = new byte[bytesAvailable];        
                                mmInputStream.read(packetBytes);        
                                for(int i=0;i<bytesAvailable;i++)        
                                {        
                                    byte b = packetBytes[i];        
                                    if(b == delimiter)        
                                    {        
                                        byte[] encodedBytes = new byte[readBufferPosition];        
                                        System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);        
                                        final String data = new String(encodedBytes, "US-ASCII");        
                                        readBufferPosition = 0;        

                                        handler.post(new Runnable()        
                                        {        
                                            public void run()        
                                            {                                                    
                                                myLabel.append(data);                                         
                                            }        
                                        });        
                                    }        
                                    else        
                                    {        
                                        readBuffer[readBufferPosition++] = b;        
                                    }        
                                }        
                            }        
                        }        
                        catch (IOException ex)         
                        {        
                            stopWorker = true;        
                        }        
                   }        

                }        
            });        

            workerThread.start();        
        }        

        void sendData(String msg0) throws IOException        
        {        
            msg0 += "\r";        
            mmOutputStream.write(msg0.getBytes());        
            myLabel.append("Data Sent" + "\n");        
        }        

    }        
4

1 に答える 1

2

これはかなり古い質問であることを認識しています。ただし、同様のアプリケーションを開発しているため、別の方法で解決しましたが、役立つ場合があります。

送信間の遅延の代わりに、フラグを介して送信/応答ロジックを実装できます。したがって、最初の接続はinitial. を送信し、enableフラグを に設定しますenableRequested。次に、リスナーに応答を待機させます。送信を続行したらpassword、フラグをに設定してpasswordSent、スレッドを再度解放します。

したがって、onCreate では実行せず、スレッドをトリガーして onCreate から接続することをお勧めします。それはうまくいくはずです。

于 2013-01-11T02:10:19.940 に答える