数据分析线程在读信号量和消费者指针的控制下成功读取一包数据后,根据通道标示号提取此包中每个通道的数据,写入对应的内存映射文件中,再调用数据处理函数对每个通道数据做误码分析。误码分析的结果可由主界面线程调用显示。数据分解流程如图4所示。
为了保证测试效率和数据处理的正确性,pWriteCounter既用于控制内存映射文件写入数据指针的移动,也用于判断已接收的数据字节数,作为数据处理时读内存映射文件指针的参考和是否开始对数据进行分析的条件。数据处理时,并不是内存映射文件中写入数据后就马上开始分析,而是根据pWriteCounter确定已接收的数据字节数,直到接收回来大于一个标准帧长度的数据后才开始对此帧数据的误码率分析,这样既避免了多次分析一帧数据,又保证了数据分析的正确性,而且减少了数据分析线程独占CPU的时间。从最终实际运行结果来看,此方法有效解决了数据
实时采集过程中掉数据的问题。
数据经分解写入对应通道内存映射文件后,还需要实时地将每个通道接收回来的测试数据和标准数据进行对比分析,并以误码率形式进行显示,测试人员根据实时变化的误码率即可监测数字接口设备是否工作正常。数据分析处理流程如图5所示。在实际使用中,数字接口设备可能出现的故障现象较多,采集接收回来的数据量相当大且数据出错情况各不相同,不能误判或漏掉任何一种情况,通过反复测试得出以下对固定格式数据处理的方法:
①从每个通道的内存映射文件中逐个字节扫描帧头0xAA,一旦检测到帧头0xAA,进入第②步。
②首先判断此帧数据的帧尾位置是否为0x10,以及帧尾的前一个数据和对应的标准数据(标准数据帧尾的前一个数)是否相同,若同时满足这两个条件,说明此帧数据为标准帧(此帧数据长度和发送的标准帧帧长度相等),若不满足进行第④步操作。
③判断此帧为标准帧后,从此帧数据和标准数据的第二位开始到帧尾一一进行对比判断(跳过第0个帧头数据和第1个计数器数据),不相等则记录出错,每发现一处错误字节,错误字节数加1。进入第⑥步。
④从帧头到帧长度数据范围内查找是否出现0xAA,出现0xAA,首先用第②步操作判断此0xAA是否为下一帧数据的帧头,若是下一帧数据帧头,记录帧头前一个字节为此帧帧尾位置,说明此帧数据有掉数据现象,否则为错误数据,调用非标准帧处理。
⑤从此帧数据和标准数据的第二位开始到确定的该帧长度范围内数据进行一一对比判断 (跳过第0个帧头数据和第1个计数器数据),不相等则记录出错,并判断为错误一个字节。
⑥检查该帧中计数器数据与前后帧的计数器数据是否连续,如果连续则没有帧出错,否则有掉帧现象出现,需要根据前后计数器数据确定掉帧的长度,并转化为对应错误字节数。
同时接上两个被测设备验证整个系统的性能,即使每个通道均选择工作在最高波特率614.4 kbps和最高循环发送帧周期5ms下,仍能保证数据采集实时高速、数据质量稳定且误码率低。
结束语
实时测试与结果显示如图6所示。该技术已经成功应用于某数字接口设备的检测与维修系统,取得了良好的效果。经大量测试验证,此种
多线程、内存映射文件和两级缓冲的方法在高速实时数据采集和分析中效果很好。根据生产者和消费者的思想建立的读写信号量有效地实现了采集和分析线程间的同步,内存映射文件的大小在开始测试前申请为100M,当需要更长时间测试时还可以动态申请开辟新的内存空间,既保证了系统的实时性要求,又有效节约了系统内存资源。