以下函数用于从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;
}
答案 0 :(得分:2)
来自the man
read()尝试从文件描述符fd读取向上计数字节到从buf开始的缓冲区。
返回值
成功时,返回读取的字节数(零表示文件结束),
换句话说,count
参数是您想要读取的最大字节数,但是read可以返回不同的字节数。
返回值为您提供FD的读取字节数。
要简单地解决它,你可以循环接收字节,直到达到预期的长度,一次读取1个字节。
可以使用Read Timeouts
实施其他解决方案