【发布时间】:2017-04-16 20:19:06
【问题描述】:
我想从 arduino 读取序列。我使用此代码:
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/ioctl.h>
int main(){
char data[1024];
char dev[] = "/dev/ttyACM1";
int fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, FNDELAY);
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= CS8;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
tcsetattr(fd, TCSANOW, &options);
ioctl(fd, TCFLSH, 2);
while(1){
read(fd, data, sizeof(data));
printf(data);
}
//write(fd, data, sizeof(data));
}
我的 arduino 运行非常简单的草图:
int x;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("DO YOU HEAR ME ??");
delay(1000);
}
这个组合的输出是:
??OU HEAR ME ??
DO YOU HEAR ME ??
DO YOU HEAR ME ??
A¹þ
??OU HEAR ME ??
DO YOU HEAR ME ??
DO YOU HEAR ME ??
A¹þ
??OU HEAR ME ??
DO YOU HEAR ME ??
DO YOU HEAR ME ??
我的问题是如何从混乱中恢复秩序。我发现当缓冲区结束并开始新缓冲区时会出现此问题(更大的缓冲区更少垃圾数据)但我不能拥有无限缓冲区。第一次读取时也有很多垃圾..有没有办法同步它或其他什么?
(另外我不是英语母语,如有错误请见谅。)
【问题讨论】:
-
尝试检查
read的返回值。 -
@DavidCullen 我启用了规范输入,现在垃圾只发生在行首。所以我现在假设输入中有一些额外的位。但我不知道从在哪里(就像 3 个字符,3 个字节)。
-
附注,尝试提高波特率,看看是否解决问题?
-
@LethalProgrammer 不,我试过了......我认为它必须对标志做一些事情,但我不知道在这一点上是......为什么它不能像发送一样?只写和读?
-
如果你不检查
read的返回值,它可能会返回一个错误值。但是,您的程序仍将打印data缓冲区。此外,在成功时,read的返回值将是读取的字节数,您应该使用它来确保data以空值结尾。
标签: c linux arduino serial-communication