read()函数在硬件中断时从串行端口读取时丢失字节

时间:2012-07-04 03:45:25

标签: c qt pthreads serial-port interrupt

情景是这样的,

我有一个线程(pthread_create)运行,它从串口端口连续读取数据块,并根据读取的值绘制实时图形(使用Qt中的QPainter)。对于读取,我使用函数read(3)

数据包以每秒255个采样的速率发送,只有255的第一个数据具有报头。只要CPU没有被中断,这就好了。它会实时绘制数据,没有任何延迟或干扰。

但是当CPU中断时,(例如:网络电缆未插入/插入,或者USB插入/拔出)图形受到干扰,当我记录读取数据时,我意识到当CPU中断时它丢失了一些数据,所以字节顺序丢失了。我在绘图中所做的是,如果找到标题,我会逐个读取下一个254个数据包,假设接下来的254个数据包是无标题数据。(标题包长25个字节,没有标题的包是17个字节)。因此,当CPU中断时更改顺序,我正在读取并绘制不同步数据。

我怀疑OS内部用于存储从串口读取的数据的缓冲区大小。因为这个中断处理消耗大约2-3秒,同时缓冲区可能会被填满,并且有可能刷新一些未读数据。我的环境是omap-board ARM处理器1 ghz speed单核(OS linux)。我在QT开发了这个应用程序。

可能是什么问题?是否有比read()更高优先级的功能?但是,如果中断是硬件中断,那又无关紧要吗?

为了在串口中强加流量控制,我在termios结构中设置标志如下..

    struct termios options;
    options.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;
    options.c_iflag = IGNPAR;
    options.c_oflag = 0;
    options.c_lflag = 0;
    tcflush(fd, TCIFLUSH);
if( -1 == tcsetattr(fd, TCSANOW, &options))
{
    printf("\ntcsetattr failed, errno=%d", errno );
}

0 个答案:

没有答案