请教用生产者/消费者架构进行模拟输出时候的问题

2019-07-17 17:29发布

初学乍练,还望大家多多指教。
我想模拟输出连续播放一个读取自文件的数据,因为数据比较大,所以采用了生产者/消费者模式。生产者循环读取数据放入队列,消费者循环出队列的数据一方面画出来,另一方面模拟输出。画出来的结果看起来挺正常,模拟输出的结果重新用模拟输入采集后发现丢失了很多段数据点,用示波器看也是如此。我试着调了模拟输出缓存大小,比生产者循环每次放入队列的数据量小或大几倍都没什么效果。希望能有专家帮我指出问题所在,多谢啦!
数据丢失截屏 数据丢失截屏
simultaneous AI AO producer consumer.vi 下载积分: 积分 -1 分
76.59 KB, 下载次数: 60, 下载积分: 积分 -1 分 我的vi
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
lingzhiquan
1楼-- · 2019-07-17 21:17
看了程序,可惜我没装有程序里DAQ那个模块,程序显示不全。
队列的数据都存在电脑内存,一般不会出现数据掉失的问题。
可你的模拟输入没有使用队列的类似方法进行处理。直接通过DAQmx Write.vi输出,在这个循环输出中因为元素出队列和10ms延时模块导致输出每个数据出现滞后现象。而你的DAQmx Read.vi在循环采集数据的时间很快,所以会出现每个数据重复采集好几个,出现上面有直线数据的问题。

幸运者
2楼-- · 2019-07-17 21:33
 精彩回答 2  元偷偷看……
946857750
3楼-- · 2019-07-18 00:43
学习
citeseer
4楼-- · 2019-07-18 01:36
lingzhiquan 发表于 2012-7-14 15:24
看了程序,可惜我没装有程序里DAQ那个模块,程序显示不全。
队列的数据都存在电脑内存,一般不会出现数据掉 ...

谢谢您的帮助。
我现在有点不清楚。我试了两件事,一是把模拟输出连到示波器,发现还是有大段大段的直线;二是试了把模拟输入和输出的循环合并,但结果还是没有变化。模拟正弦波送到队列里,从模拟输入记录到的是信号仿佛被时间上压缩了一样。

citeseer
5楼-- · 2019-07-18 03:40
我试了更简单的情况,Configure -> Timing -> Write ->Start -> Is Done? -> Stop -> Clear, Is Done?在while loop中, 这样输出正弦波是可以的。但是我之所以使用生产者/消费者模式,是因为数据太大,不能一次写进buffer,所以想要把write或者出队列包括到while里面,但是这样简单的情况,如果把Write -> Start -> Is Done? 都包进去就会输出错误结果,Stop也包进去则会报错。
citeseer
6楼-- · 2019-07-18 07:39
把write写在start前面是必须的。但是不能每次循环都写一次,开始一次,所以要让start只有第一次有效,然后就可以了。

一周热门 更多>