3

私のArduinoは、携帯電話から送信される文字をリッスンしてセンサー データを印刷し、 Bluetoothモジュール経由で送り返します。これは正常に機能しており、通信は高速かつ正確です。ただし、2 つの異なるセンサーからデータを要求すると問題が発生します。

センサー A からデータを要求し、結果を取得します。次に、センサー B からデータを要求し、センサー A への残りの要求と思われるものを取得し、センサー A から再び情報を取得します。センサー B からのデータを 2 回続けて要求でき、センサー B から正確にデータを受信します。

入力ストリームをフラッシュしようとしましたが、アプリケーションがクラッシュしました。また、 InputStream.wait() を使用してから、別のセンサーからデータを要求するときに InputStream.notify() で待機を中断しようとしました。これもプログラムをクラッシュさせました。

これは私の受信コードです。渡される文字は、Arduino から送り返すセンサー データを定義する文字です。

public String receive(Character c) {
    try {
        myOutputStream.write(c);
        final Handler handler = new Handler();
        final byte delimiter = 10; // ASCII code for a newline
        stopWorker = false;
        readBufferPosition = 0;
        readBuffer = new byte[1024];
        myThread = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()
                        && !stopWorker) {

                    try {

                        int bytesAvailable = myInputStream.available();
                        if (bytesAvailable > 0) {
                            byte[] packetBytes = new byte[bytesAvailable];
                            myInputStream.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() {
                                            status = data;
                                        }
                                    });
                                } else {
                                    readBuffer[readBufferPosition++] = b;
                                }
                            }
                        }
                    } 
                    catch (IOException ex) {
                        stopWorker = true;
                    }
                }
            }
        });

        myThread.start();
        return (status);
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        status = "Failed";
        e.printStackTrace();
    }
    return (status);
}

これは Arduino コードの一部で、非常に単純です。

if(bluetooth.available()) //If something was sent from phone
{
    char toSend = (char)bluetooth.read(); //Reads the char sent
    if (toSend == 'T')
    {
      //If the char is T, turn on the light.
      float voltage = analogRead(14) * 5.04;
      voltage /= 1024.0;
      float temperatureC = (voltage - .5) * 100;
      float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
      bluetooth.println(temperatureF);
}

この問題を解決するにはどうすればよいですか?

4

0 に答える 0