C 来自串行端口的垃圾数据

C 来自串行端口的垃圾数据,c,linux,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

我在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);
我的问题是上面的代码没有读取第一次传输的数据,第二次传输的数据是垃圾数据,第三次是正常数据

我是否错过了串行端口中的设置


谢谢。

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

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

我要做的是有一个“预期字节数,获得字节数”的表格,并运行它进行5-6次试验

接下来,如果这对你没有帮助,把两边的波特率调低到2400左右。是的,我是认真的。这可以修复一些奇怪的错误


你应该研究如何使用示波器。如果您预计这是您长期维护的东西,那么o-scope可能非常方便。

串行端口的硬件特性使其某些行为无法预测。乍一看,我想知道您是否应该在覆盖值之前将旧的\u opt复制到新的\u opt。实际上,您可能正在从新选项中输入未初始化的值。。。但我必须检查termios接口才能确定。当你说第一个不起作用,第二个是乱码,你是说在这个程序上运行了三次,还是说运行了一个不同的循环版本?我想知道您是否在每次运行之间重置termios设置。串行端口上的垃圾通常表示发送方和接收方之间的串行端口设置不正确。对于正在进行发送的设备,您使用了哪些设置?如果在检查read()的返回值后移动rbuff打印,也可能会有所帮助。请确保字符串在读取后仍然以“\0”结尾。因此,您应该将缓冲区放大1或从串行端口读取一个字节。每次读取后ret的值是多少?