我的设置:
Android 设备 =(WiFi)=> Linksys 路由器 (WRT54G) =(串口)=> Arduino
Android 设备:使用套接字 IO - 连接到路由器
Linksys 路由器:Linux 套接字 IO - 接受客户端
Arduino:从路由器串行读取数据。我已经在路由器上焊接了一个串口。
串行波特率为 9600,因此一切都是同步的。
问题:
我可以看到服务器将数据正确打印到控制台,但我在 Arduino 控制台中看到奇怪的字符。这是我所看到的:
从 Android 设备:向上
路由器控制台:
<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;停产 = ;
尾数2 = ;开关=;开始=^Q;停止=^S;暂停=^Z; rprnt = ^R;
韦拉塞 = ^W;下一个 = ^V;齐平=^O;分钟= 1;时间=0;
Arduino:
Serial.begin(9600);
delay(50);
最佳答案
当您使用Android应用程序发送数据时,您确定从路由器写入arduino的数据中有换行吗?我不确定这些是否是导致您的错误的原因,但我建议:
- 在 android(或服务器)中添加“\n”。
- 如果您希望 arduino 中使用 ascii 字符,请确保 android 应用程序(java?)正在发送 ascii 字符。
- 写入服务器时使用
int inData
作为长度。检查其长度是否有意义。 - 检查
int result
是否有错误,并与inData
进行比较
关于c - 通过串口将数据从 C 发送到 arduino 时,我应该进行任何转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288939/