我的设置:
Android 设备 =(WiFi)=> Linksys 路由器 (WRT54G) =(serial)=> Arduino
Android 设备:使用套接字 IO - 连接到路由器
Linksys 路由器:Linux 套接字 IO - 接受客户端
Arduino:从路由器串行读取数据。我在路由器上焊了一个串口。
串行端口速率为 9600,所以一切都是同步的。
问题:
我可以看到服务器将数据正确打印到控制台,但我在 Arduino 控制台中看到奇怪的字符。这是我看到的:
从安卓设备: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; 内部 = ^C; 退出 = ^\; 擦除 = ^?; 杀死 = ^U; eof = ^D; eol = ; eol2 = ; 开关 = ; 开始 = ^Q; 停止 = ^S; 悬念 = ^Z; rprnt = ^R; 错误 = ^W; 下一个 = ^V; 冲洗 = ^O; 最小值 = 1; 时间=0;
阿杜诺:
Serial.begin(9600);
delay(50);