1

チュートリアルの Android と Arduino 間の Bluetooth 経由のデータ転送を使用して、Arduinoからコードを受信します。

ID txtArduino で textview を作成し、使用して.appendいますが、Arduino が送信したときに不完全なテキストが表示されるのはなぜですか?

例えば:

LED オン、および: w- . イイン:13

そして、このような同様の奇妙なテキスト。

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

PS: 必要に応じて、さらにコードを提供できます。

Android ヘッダー

h = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case RECIEVE_MESSAGE:                                     // If receive massage
                byte[] readBuf = (byte[]) msg.obj;
                String strIncom = new String(readBuf, 0, msg.arg1);   // Create string from bytes array
                sb.append(strIncom);                                  // Append string
                int endOfLineIndex = sb.indexOf("\r\n");              // Determine the end-of-line
                if (endOfLineIndex > 0) {                             // If end-of-line,
                    String sbprint = sb.substring(0, endOfLineIndex); // Extract string
                    sb.delete(0, sb.length());                        // And clear
                    txtArduino.append(sbprint + "\n");                // Update TextView

                    //toggleDOOR.setEnabled(true);
                }
                Log.d(TAG, "...Mesaj:"+ sb.toString() +  " Byte:" + msg.arg1 + "...");
                break;
            }
    };
};

Arduino コード:

int cnt = 0;
int pinLed = 13;

String myKey = "0000001";

//Pin Geam Masina 2 si 3
int pinGeamInchis = 2;
int pinGeamDeschis = 3;

char incomingByte;
void setup(){
    Serial.begin(9600);

    //INITIALIZARE
    pinMode(pinLed,OUTPUT);
    pinMode(pinGeamInchis,OUTPUT);
    pinMode(pinGeamDeschis,OUTPUT);

    digitalWrite(pinLed,LOW);

    Serial.print("Modul ON( KEY:");
    Serial.print(myKey);
    Serial.print(" )\r\n");
}

void loop(){
    if(Serial.available()> 0){
        incomingByte = Serial.read();
        if(incomingByte == '0'){
            //Opreste LED
            digitalWrite(pinLed,LOW);
            Serial.print("Pin 13: LED OFF\r\n");

            //Inchide Geam
            digitalWrite(pinGeamInchis,HIGH);
            Serial.print("Command:W-C\r\n");
            delay(500);
            digitalWrite(pinGeamInchis,LOW);
            Serial.print("Pin 2:Window Down\r\n");
        }
        if(incomingByte == '1'){
            //Aprinde LED
            digitalWrite(pinLed,HIGH);
            Serial.print("LED ON\r\n");

            //Deschide Geam
            digitalWrite(pinGeamDeschis,HIGH);
            Serial.print("Command:W-O\r\n");
            delay(500);
            digitalWrite(pinGeamDeschis,LOW);
            Serial.print("Pin 3:Window Up\r\n");
        }
    }
}

なるほど、「コマンド」を 1 つだけ送信すれば機能します。シリアルと Android でより多くのコマンドを受信できるようにするにはどうすればよいですか?

PS: Arduino Nanoを使用しています。

4

2 に答える 2

0

Arduino 側で print("/r/n") を送信する代わりに、空の System.println(); を置くだけです。

このような:

void taskTransmitData(void)
{
  // start the xml
  Serial.print("HE");
  Serial.print(pMyMemory->currentHeading);
  Serial.print("/HE");

---- 

  Serial.print("CS");
  Serial.print(currentState);
  Serial.print("/CS");

  Serial.println();

}

Android側では、これはうまくいくはずです:

bytes = mmInStream.read(buffer);
byte[] readBuf = (byte[]) buffer;
String strIncom = new String(readBuf, 0, bytes); // create string from bytes array
sb.append(strIncom);      // append string
int endOfLineIndex = sb.indexOf("\r\n");  // determine the end-of-line
if (endOfLineIndex > 0) {  
    // add the current string to eol to a local string
    String sbprint = sb.substring(0, endOfLineIndex);

    // get the start and end indexes of the heading
    int startHeading = sb.indexOf("HE");
    int endHeading = sb.indexOf("/HE");

    // set the heading
    Henry.this.setCurrentHeading(sb.substring((startHeading + 2), endHeading));

    ......

    // get the start and end indexes of the current state
    int startCS = sb.indexOf("CS");
    int endCS = sb.indexOf("/CS");

    // set the current state
    Henry.this.currentState = sb.substring((startCS + 2), endCS);

    // output what we have
    //System.out.println("recv: " + sbprint);
    sb.delete(0, sb.length());   
}
于 2013-04-27T16:54:16.023 に答える
0

分析

あなたのAndroidコードを見る:

String sbprint = sb.substring(0, endOfLineIndex); // Extract string
sb.delete(0, sb.length());                        // And clear
txtArduino.append(sbprint + "\n");                // Update TextView

(最初の)改行まで受信したメッセージを取得し、メッセージ全体を削除します。受信した特定の「メッセージ」内にどれだけのデータが含まれているかはわかりません。

たとえば、Arduinoが行う場合:

Serial.print("Pin 13: LED OFF\r\n");
// [...]
Serial.print("Command:W-C\r\n");

これは、次のように BT モジュールに送信されます。

Serial.print("Pin 13: LED OFF\r\nCommand:W-C\r\n");

そして、「誰か」(BT モジュール? Android OS? ...?) は、これを2 つの「メッセージ」(または「パケット」) に入れることを決定する場合があります。たとえば、

Message1: "Pin 13: LED OFF\r\nComm"
Message2: "and:W-C\r\n"

この場合、表示されるのは

"Pin 13: LED OFF"

"and:W-C"

"Comm"最初のメッセージの一部を削除したため、表示されます。

提案

文字列全体を削除するのではなく、実際に表示されている部分のみを削除し、残りは次のメッセージまでに完了するように保持するように、 yoursb.delete(0, sb.length());をに置き換えてみてください。sb.delete(0, endOfLineIndex + "\r\n".length());

次に、ループを追加して、メッセージに複数の改行がある場合にコードが失敗しないようにする必要があります。このためには、次のように置き換えます。

int endOfLineIndex = sb.indexOf("\r\n"); // Determine the end-of-line
if (endOfLineIndex > 0) {                // If end-of-line,

int endOfLineIndex; 
while ( (endOfLineIndex = sb.indexOf("\r\n")) > 0) { // While there's at least one complete line in buffer,
于 2013-04-19T18:17:47.600 に答える