最近在做一个上位机,遇到了这样一个问题。串口会源源不断的发来数据,我这边要对这些数据进行解析,存储解析日志。按照基本的想法,构造了一个队列。
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不够最后一次解析的数据个数时,跳出循环。问题解决。