来自串口的垃圾数据

时间:2010-06-07 03:10:08

标签: c linux

我在Linux平台上编写了一个代码,用于读取串口数据,我的代码如下:

int fd;
char *rbuff=NULL;
struct termios new_opt, old_opt;
int ret;

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if( fd == -1 )
{
   printf("Can't open file: %s\n", strerror(errno));
   return -1;
}
tcgetattr(fd, &old_opt);
new_opt.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
new_opt.c_iflag = IGNPAR /*| ICRNL*/;
new_opt.c_oflag = 0;
new_opt.c_lflag = ICANON;

tcsetattr(fd, TCSANOW, &new_opt);
rbuff = malloc(NBUFF);
printf("reading..\n");
memset(rbuff,0x00,NBUFF);
ret = read(fd, rbuff, NBUFF);
printf("value:%s",rbuff);
if(ret == -1)
{
   printf("Read error:%s\n",strerror(errno));
   return -1;
}
tcsetattr(fd, TCSANOW, &old_opt);
close(fd);

我的问题是上面的代码没有读取传输的第一个数据,然后第二个传输数据是垃圾,那么第三个是正常数据。

我错过了串口设置吗?

感谢。

2 个答案:

答案 0 :(得分:1)

听起来您的串口设置已关闭 - 猜测,您正在以8位而不是7位读取。您 可以让双方以相同的设置进行传输。

我要做的是有一个“预期字节数,字节数”的表,然后运行5-6次试验。

接下来,如果这对您没有帮助,请将两侧的波特率调低至2400左右。是的,我很认真。这可以解决一些古怪的错误。

您应该调查一下示波器。如果你预计这是你长期保持的东西,那么o范围可以非常方便。

答案 1 :(得分:0)

如果您正在谈论硬件串行端口(RS-232),我建议使用像BusBee这样的串行端口分析器来查看实际发送到串行端口的内容。如果您使用总线蜂,请记得在BusBee之前放置一个收发器,以将电压电平从RS-232调整到TTL。或者,如果您可以访问示波器,则可以使用它来读取RS-232线路上的信号并自行解码字节。