0

私のセットアップ:

Android デバイス =(WiFi)=> Linksys ルーター (WRT54G) =(シリアル)=> Arduino

Android デバイス : ソケット IO を使用 - ルーターに接続
Linksys ルーター : Linux ソケット IO - クライアントを受け入れる
Arduino : ルーターからデータをシリアルに読み取ります。ルーターのシリアルポートをはんだ付けしました。

シリアル ボーレートは 9600 であるため、同期が取れています。

問題:
サーバーがデータをコンソールに正しく出力しているのを確認できますが、Arduino コンソールに奇妙な文字が表示されます。ここに私が見るものがあります:

Android デバイスから:up

ルーターコンソール:

<Received : up

Arduino コンソール:

received: BELBELBELBELBELBELBELBELBELBELBELBELBELBELBEL up 
received: 

この BEL キャラクターがどこから来たのかわかりません。

私の実験:
ルーターコンソールウィンドウからこれを行うと:

$> echo "hello" > /dev/tts/1

Arduino側で適切なデータを取得します。つまり、次のようになります。

received: hello
received:

私のコード:
ルーターコード

int fd;
char *portname = "/dev/tts/1";

fd = open(portname, O_WRONLY);

if (fd < 0)
{
    printf("Error : cannot open port %s\n", portname);
    return -1;
}
...
    connfd = accept(listenfd, (struct sockaddr*)&serv_addr, &len);
    printf("accept OK!\n");
    printf("accepted connection from %s\n", inet_ntoa(serv_addr.sin_addr));

    char rcvbuf[MAX_BUFF_SIZE] = { '\0' };

    while(1)
    {
        int inData = recv(connfd, rcvbuf, sizeof(rcvbuf), 0);


        if (inData <= 0)
        {
         printf("Client closed!\n");
         break;
        }

        int result = write(fd, rcvbuf, strlen(rcvbuf));

        printf("<Received : %s\n", rcvbuf);

        // reset memory otherwise we will have data
        // from previous data
        bzero((char *)rcvbuff, sizeof(rcvbuf));
     }

...

Arduino コード:

// the loop routine runs over and over again forever:
void loop() {

        while (Serial.available() > 0)
        {
          char inChar = (char)Serial.read();

          if (inChar == '\n' || inChar == '\r' || inChar == '\n\r' || inChar == '\r\n')
          {
            DATA_READ = true;
            break;
          }

          inputString += inChar;          
        }        
        // send data only when you receive data:
        if (DATA_READ) 
        {
          if (inputString[0] != ' ' || inputString[0] != '\n')
          {
            Serial.print("received: ");
            Serial.println(inputString + " " + inputString[0]);

            process_message(inputString[0]);

            // prepare for next round
            DATA_READ = false;

            Serial.flush();
            inputString = "";
          }
        }        
}

*ポインターをいただければ幸いです:)


詳細については、ボーレートを編集して追加してください:ルーター

root@OpenWrt:/usr/bin# stty -F /dev/tts/1 -a
速度 9600 ボー; 行 0; 列 0; 行 = 0; intr = ^C; 終了 = ^\; 消去 = ^?; 殺す = ^U; eof = ^D; eol = ; eol2 = ; スイッチ = ; 開始 = ^Q; 停止 = ^S; Susp = ^Z; rprnt = ^R; ウェラセ = ^W; lnext = ^V; フラッシュ = ^O; 分 = 1; 時間 = 0;

アルドゥイーノ:

  Serial.begin(9600);

  delay(50);
4

1 に答える 1

0

Androidアプリで送信する場合、ルーターからarduinoに書き込むデータに改行がありますか? これらのいずれかがバグの原因であるかどうかはわかりませんが、次のことをお勧めします。

  1. Android(またはサーバー)に「\ n」を追加します。
  2. arduinoでASCII文字が必要な場合は、Androidアプリ(Java?)がASCII文字を送信していることを確認してください。
  3. int inDataサーバーに書き込むときの長さとして使用します。その長さが理にかなっていることを確認してください。
  4. エラーをチェックint resultして比較するinData
于 2014-03-12T09:01:53.057 に答える