FIFO队列使用时出队列遇到的问题

最近在做一个上位机,遇到了这样一个问题。串口会源源不断的发来数据,我这边要对这些数据进行解析,存储解析日志。按照基本的想法,构造了一个队列。

typedef  struct
{
    int OutPos;
    int InPos;
    BYTE log[logsize];
}LOG_BUF;//结构体,用来存储队列首尾指针及数据缓存区
LOG_BUF logbuf;

然后在一个线程中检测串口是否有数据,有数据就存入这个队列中。

memcpy(&logbuf.log[logbuf.InPos],ch_read,lenght_queue);         
            logbuf.InPos=(logbuf.InPos+lenght_queue)%logsize;

并在该线程中,将数据从队列中取出

memcpy(ch_log,&logbuf.log[logbuf.OutPos],5);
               logbuf.OutPos=(logbuf.OutPos+5)%logsize;

之后对取出的数据进行一些解析和判断。

这个线程写的是一个死循环,在实际测试中发现这种写法会出现一个问题,那就是线程何时终止。我完成上述程序后,发现即便是发送数据结束,但是上位机这边一直在解析,不停止。除了一般点击按钮强制关闭之外,合适的终止方式应该是串口数据发送结束,上位机这边将队列中未解析的数据解析完之后,即队列为空时,头尾指针相等,跳出循环。

解决的方法是增加一个计数Count,当入队列时,Count++,出队列时,Count–,如果Count不够最后一次解析的数据个数时,跳出循环。问题解决。

猜你喜欢

转载自blog.csdn.net/qq_27437671/article/details/78564142