2

我在 Linux 系统中从串行读取数据时遇到了麻烦。我正在尝试使用 UART 将传感器与 linux 系统连接起来。我可以读写/dev/ttyS1。但问题是我不想从 UART 轮询消息。相反,我想使用异步模式来获取数据。随着数据的到来,回调函数将进入某个例程并运行我的代码。问题不在于传感器向我发送了不同的数据包,每个数据包都包含不同字节的数据。他们每一秒都来!

例如:

Time              Sensor          MyLinux
1s                        50bytes
                          124bytes
2s                        40bytes
                          174bytes
3s                        60bytes
                          244bytes

我的问题是如何使用异步串行编程,以便在回调函数中,这两个数据包可以作为两条消息读取

说50字节来了,回调函数可以让我读50字节 127字节来了,回调函数可以让我读127字节

现在,50 个字节来了,我只能读取 27 个字节,剩下的 23 个在下一条消息中。

我在 POSIX 中对串口的设置是:

    /* now we setup the values in port's termios */
    serial->tio.c_cflag=baudrate|databits|checkparity|stopbits|CLOCAL|CREAD;
    serial->tio.c_iflag=IGNPAR;
    serial->tio.c_oflag=0;
    serial->tio.c_lflag=0;
    serial->tio.c_cc[VMIN]=28;
    serial->tio.c_cc[VTIME]=6;

    /* we flush the port */
    tcflush(serial->fd,TCOFLUSH);
    tcflush(serial->fd,TCIFLUSH);

    /* we send new config to the port */
    tcsetattr(serial->fd,TCSANOW,&(serial->tio));
4

1 回答 1

1

尝试将 VMIN 和 VTIME 设置为以下值:

serial->tio.c_cc[VMIN]=0;
serial->tio.c_cc[VTIME]=1;

然后,在从传感器读取完整的数据块后,您将退出 select()。如果字节数少于您的预期,您可以为选择设置超时并再次读取附加到当前缓冲区的数据。如果您在超时之前获得数据,那么您将获得完整的消息。

于 2013-10-28T10:37:44.427 回答