多通道串口采存系统如何运用生产者消费者构架
生产者消费者循环,真 的可以吗?
并行可以实现吗?
基本概念:生产者和消费者是两个并行的循环,二者通过一个队列来异步传输数据(即两个循环的执行时间不相同)。
--------
生产者:采集数据,比如你的程序是通过串口来读取数据的,目测应该不会用48个串口,应该是一个或者几个串口来读取所有通道,因此在编写程序时,下位机程序对目标通道扫描,将各个通道的数据串行发送给pc上的labview程序,labview程序中的“生产者”部分,对接收到的数据进行进行简单的处理,甚至不处理,直接丢入数据传输队列中;
消费者:通过前述的队列,从生产者部分获取到源源不断的数据,对数据进行处理,显示,存储等操作。
-------------
用这个模式的好处是:数据不会丢失。由于你的数据频率不高,显示什么的不会有滞后。这个模式简单来说就是流水线。
谢谢,写这么多,辛苦了。我需要采48个点的温度,所以会用到48个传感器,这个传感器模块都是串口发送数据的,我转换成了USB口,所以到时候是48个USB口,会多用几个Hub,所以接口不是问题。这个传感器一秒钟发送两百多组数据,因为温度的采集不需要很高频率,我虽然都读取了,但是其实只是提取利用了很少的数据。因为假设我采样频率设为1Hz,我只要一秒钟能读到它的一组数据就可以了,所以我不怕数据丢失。我做了六路的测了几天没问题,现在主要考虑的是 按照我目前的并行结构,如果直接复制到48路,程序可能会跑不动,所以主要想有没有好的架构,可以让我48路采集的占用资源比较少,让labview程序连续长时间运行不会出错。不知道你有何想法,请指教!
真有这么多串口。
有个比较偷懒的办法是这样:for循环里面一次读6个通道,将48个串口(ref)分成8组,每组6个串口ref,然后在每一个for循环里面一次读取6个通道(你目前已有的程序),循环8次就完成所有通道的一次轮询了。
英雄所见略同啊 ,也有其他人建议用轮询的方法。我也是计划把48路分成八组6路的,分八个波形图表显示,八个文档存储,而且我每一通道的串口号是需要配置的啊,所以怎么用for循环去轮询?每次循环我那组的串口号都各不一样,用来显示的波形图表不一样,存储的文档也不一样。这些我都还没搞清楚。现在做到用很多子VI做到了18路,程序已经有点跑不动,提示“完成该操作所需内存不足了”。
每个串口只能分开配置,配置完成之后,输出ta的resource name,将所有的打包成一个6*8的二维数组。后面用for循环挨个通道读取,每个通道的数据经过处理后得到一个数,再将这所有通道的数打包成一个6*8的二维数组,后面再对这个二维数据进行显示和存储。存储的文件应该是类似COM_N_Time.txt这样类似的文件名吧,这些都可以和通道挂上勾,用for循环的方式挨个操作去。当然,同时操作48个文件的写入,可能是比较费劲些,你可以写入到一个文件中,比如用tdms文件存储数据。
嫌48个串口挨个读取、配置太麻烦用这个:
前提是各个串口的参数配置是一样的。
接下来,你就可以利用上贴得到的串口array来获取每个通道的数据了:
此时获取到的数据就随便你去处理了。
当然,你执意用之前的程序+for循环也ok:我示意下。2*2数组
谢谢小编分享
好人啊,谢谢!看着很不错,不过我比较菜,先琢磨琢磨有不懂再来请教。再次表示感谢!
小编可以分享下你的六路程序吗
我有个帖子分享了。你好像已经看到了
说明一下,我用的是网上买DS18B20温度传感器模块,上电后通过串口不停发送格式为“0xaa 0xxx 0xxx 0xxx 0xxx 0xff ”的数据,波特率为115200
第一位:0xaa为帧头 表示串口的起始数据
第二位:表示温度的符号位 如果第二位为0x00 则表示负温度 ,如果为0x01则表示正温度
第三位:温度的数据位高位
第四位:温度的数据位低位(温度的计算方式为temp:(高位*256+低位)*0.01) 单位为摄氏度
第五位:校验位 为温度符号位+高位字节+低位字节
例如:AA 01 0B 02 0E FF 其0E=01+0B+02
第六位:串口通信停止位0xff。
看你用的传感器的数据格式吧,合适的修改应该可以用。
谢谢你的回答
我也准备采用生产者/消费者模式来需要采集40路的信号,多谢小编分享
220V交流 电源线标准
谢谢小编分享~~~~~