代码之家  ›  专栏  ›  技术社区  ›  domlao

来自串行端口的垃圾数据

  •  5
  • domlao  · 技术社区  · 16 年前

    我在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 回复  |  直到 16 年前
        1
  •  1
  •   Paul Nathan    16 年前

    听起来你的串行端口设置是关闭的-据猜测,你读的是8位而不是7位。你 使两边用相同的设置进行传输。

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

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

    你应该调查一下如何用示波器。如果您预期这是您长期维护的内容,那么o-scope可能非常方便。

        2
  •  0
  •   mjh2007    16 年前

    如果你说的是一个硬件串行端口(RS-232),我建议你使用一个串行端口分析仪,如一个总线,看看什么是真正发送到串行端口。如果您使用总线蜂,记得在总线蜂之前放置一个收发器,以调整从RS-232到TTL的电压水平。或者,如果你可以使用示波器,你可以用它来读取RS-232线路上的信号,并自己解码字节。