私のセットアップ:
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);