串口读取不完整

时间:2017-05-09 14:00:45

标签: c linux serial-port tty termios

以下函数用于从Linux下的串行端口读取数据。我可以在调试时读取完整的数据,但是当我启动程序时, read_buffer 似乎不完整。我正确地接收了一小部分数据,但缓冲区的其余部分完全。可能是什么问题?

int8_t __serial_port_open(uint8_t *port)
{
    mode_t perms = S_IRWXU;
    fd = open(port, O_RDWR | O_NOCTTY | O_SYNC, perms);
    if (fd < 0)
    {
        return -1;
    }

    if (__serial_port_configure() != 0)
        return -1;

    return 0;
}

static int8_t __serial_port_configure(void)
{
    struct termios attr;

    if (tcgetattr(fd, &attr) == -1)
    {
        return -1;
    }
    if (cfsetispeed(&attr, B115200) == -1)
    {
        return -1;
    }
    if (cfsetospeed(&attr, B115200) == -1)
    {
        return -1;
    }
    attr.c_cflag |= (CLOCAL | CREAD);
    attr.c_cflag &= ~PARENB;
    attr.c_cflag &= ~CSTOPB;
    attr.c_cflag &= ~CSIZE;
    attr.c_cflag |= (CS8);
    attr.c_cflag |= CRTSCTS;
    attr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    attr.c_iflag &= ~(IXON | IXOFF | IXANY);
    attr.c_oflag &= ~OPOST;
    if (tcsetattr(fd, TCSANOW, &attr) == -1)
    {
        return -1;
    }
    return 0;
}

int8_t __serial_port_read(uint8_t *read_buffer, uint32_t nbytes_to_read, uint32_t *nbytes_read)
{
    do
    {
        *nbytes_read = read(fd, read_buffer, nbytes_to_read);
        if (*nbytes_read == -1)
        {
            return -1;
        }
    } while (*nbytes_read == 0);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

来自the man

  

read()尝试从文件描述符fd读取向上计数字节到从buf开始的缓冲区。

     

返回值

     

成功时,返回读取的字节数(零表示文件结束),

换句话说,count参数是您想要读取的最大字节数,但是read可以返回不同的字节数。

返回值为您提供FD的读取字节数。

要简单地解决它,你可以循环接收字节,直到达到预期的长度,一次读取1个字节。

可以使用Read Timeouts

实施其他解决方案