完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
本帖最后由 hejin515 于 2015-11-4 16:23 编辑 如图,程序是采集串口发送来的数据,处理后实时显示在波形图表上然后存入TXT文档。但是昨晚采集了一晚上,整体曲线是对的,但是发现有几个夸张的突变(如图,一晚上的室内温度变化)。现在想两种解决方法:一时看看谁知道我程序哪里有问题,所以出现了那么夸张的野值。二是,进行适当的滤波,比较前后两个温度值,如果差值太大就舍弃新值用上一次的值代替。但是不知道这种方法具体该如何实现。各位有何高见,请不吝赐教!多谢了!!
|
|
相关推荐
20个回答
|
|
|
感觉蛮奇怪的,为什么运行好好的突然来个莫名其妙的值
|
|
|
|
|
|
谁知道方法二也行啊,怎么比较去除野值?
|
|
|
|
|
|
有没有会的,看看啊 ?
|
|
|
|
|
|
如果传感器发送的数据没有问题,估计还是程序有问题,程序周期性发生错误。你传感器发过来的数据帧有帧头帧尾吗,没有的话容易发生这种错误,尤其是数据帧是由多个字节组成,而且没有帧头帧尾的时候。你波特率别太高,太高的话虽然传输速度快了,但是容易受到干扰,如果非要用这么高波特率,要加校验,简单的如奇偶校验
。 |
|
|
|
|
|
说到点子上 了,谢谢!数据有格式的:0xaa 0xxx 0xxx 0xxx 0xxx 0xff。AA是帧头,FF是帧尾,第二位是温度符号位,第三位是温度数据的高位,第四位是温度数据的低位,第五位是校验位,是第二三四位的和,但不知道这是哪种校验方式?还有,这个温度传感器的波特率115200是固定的,主动发送的,不需要发送指令就会自己盲发。它一秒钟可以发大概212组数据,但是因为温度变化不大,所以我采样的频率其实很低,两三秒一次就可以了。高手您再给看看,给我提点提点吧,感激不尽。
|
|
|
|
|
ShuiMoLise 发表于 2015-11-4 19:15 说到点子上 了,谢谢!数据有格式的:0xaa 0xxx 0xxx 0xxx 0xxx 0xff。AA是帧头,FF是帧尾,第二位是温度符号位,第三位是温度数据的高位,第四位是温度数据的低位,第五位是校验位,是第二三四位的和,但不知道这是哪种校验方式?还有,这个温度传感器的波特率115200是固定的,主动发送的,不需要发送指令就会自己盲发。它一秒钟可以发大概212组数据,但是因为温度变化不大,所以我采样的频率其实很低,两三秒一次就可以了。高手您再给看看,给我提点提点吧,感激不尽。 |
|
|
|
|
|
本帖最后由 hejin515 于 2015-11-5 10:16 编辑
ShuiMoLise 发表于 2015-11-4 19:15 还有一个问题,我不启用终止符的话,假设设定一次串口读取六个字节,数据总是先收到AA,然后收到后面的五位,就这样分两次收到,甚至有时候分四次收到。但是我如果启用终止符的话(默认的0xA),就是一次收到六个字节的全部的数据(如:AA01 09B1 BBFF ,24.81℃),但是数据里面可能会出现终止字符0A,这时候就会出现问题,换成其他终止符也不行,因为都有肯能出现的。说明一下,第五位BB是校验位,是第二三四位的和(不知道这在串口中该设置成哪种校验位吗?);第二位01代表正,00代表负。 |
|
|
|
|
|
能实现while循环达到条件终止本次循环直接进行下次循环吗?
|
|
|
|
|
|
关于校验应该是要你自己编程计算 第二位+第三位=第四位。
关于接收数据,我们都是,延时个50或100ms然后一次性读取缓冲区所有字节然后转成字节数组,添加到移位寄存器,然后搜索帧头,截取6个字节,然后看看帧尾是不是ff,是的话就校验一下,没问题就计算温度值 |
|
|
|
|
ShuiMoLise 发表于 2015-11-5 22:20 谢谢!我也有延时蛮长时间,也是一次读取缓冲区所有然后转换为字节数组,然后用索引数组,直接提取第二三四位进行计算。校验我可以实现,但是关键是如果某次校验发现数据不对,想用上一次的代替,或者直接舍去进行下次循环读取串口然后计算。现在关键点就在这里,不知该如何实现这个比较去掉不正确的值。 |
|
|
|
|
ShuiMoLise 发表于 2015-11-5 22:20 把程序给你麻烦帮我 看一下吧,谢谢。
|
|
|
|
|
ShuiMoLise 发表于 2015-11-5 22:20 还有一个问题,我不启用终止符的话,假设设定一次串口读取六个字节,数据总是先收到AA,然后收到后面的五位,就这样分两次收到,甚至有时候分四次收到。但是我如果启用终止符的话(默认的0xA),就是一次收到六个字节的全部的数据(如:AA01 09B1 BBFF ,24.81℃),但是数据里面可能会出现终止字符0A,这时候就会出现问题,换成其他终止符也不行,因为都有肯能出现的。说明一下,第五位BB是校验位,是第二三四位的和(不知道这在串口中该设置成哪种校验位吗?);第二位01代表正,00代表负。 |
|
|
|
|
|
关于终止符,千万别启用,不适合你现在的程序。
你说“如果某次校验发现数据不对,想用上一次的代替,或者直接舍去进行下次循环读取串口然后计算”,关于这个首先找出帧头帧尾就是确定数据是否有效的方法一,然后那个代码和校验就是确定这一帧数据发送过程中是否收到干扰出现错误。这两个解决了基本不会有问题。 现在说一下那个怎么用上一次的值替换,可以利用移位寄存器,本次的值先和移位寄存器里的值相减后取绝对值,然后看差值占原值的百分比,超过100%就认为数据无效把就使用上次的值 |
|
|
|
|
ShuiMoLise 发表于 2015-11-6 20:48 判断数据是否有突变好说,关键是有什么好的滤波方法。下面图中三通道的,是判断某一通道有突变值时,把该突变值用该通道的平均值代替,所以还是有些小毛刺,但是比滤波前好多了。下图中一个通道的,是直接判断出如果有突变,直接舍去,不进行显示也不写入TXT。但是我们老师不满意,那个用平均值代替突变值的还是有毛刺,看起来给人感觉很不好。那个去掉突变值不显示不存储的也不好,虽然看着曲线很完美,但是写入的文本会少一些时刻的温度。我测了一些,突变率大概是0.5%,可能是我程序时序有问题,但是这个真的很难发现,所以就行用滤波的方法处理。关于你说的移位寄存器的,我试过了,假设有突变值来,虽然这次比较通不过可以用上次的值代替,但是这个突变值会进入移位寄存器而不被删除,所以下次正常值来了和它比较肯定会被判断有突变,反而正常值会被这个突变值代替了。现在就是想想有啥好的滤波方法,不知道这个你有何高见。
|
|
|
|
|
|
使用移位寄存器,你已经判断出当前值无效,再写入移位寄存器的值应该是上次的值,不是无效的值。还有要注意首次运行,移位寄存器里没有有效值,所以要判断是否是首次运行,
|
|
|
|
|
|
数值突变可能是你的线路接触不紧密导致的信号变化
|
|
|
|
|
|
我焊接的确实不是很好,但是我就放这里测一晚上的又没人动,应该不会吧。 |
|
|
|
|
ShuiMoLise 发表于 2015-11-7 17:29 把你说的想了很久,可能我对labview还不是很了解,感觉这个逻辑似乎不对啊。我是合移位寄存器里的值比较,所以怎么做到把正确的值写入移位寄存器然后再写入文本。搞这个滤波几天了,一直没想明白这个怎么处理。如果可以,烦请你稍具体说一下或者给个图吧,十分感谢! |
|
|
|
|
看不清可以点击放大 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
181 浏览 0 评论
447 浏览 0 评论
请教大神,在labview里面对实时扫描资源中的C系列模块NI9234进行配置发生非预期错误
1808 浏览 0 评论
1641 浏览 0 评论
LABVIEW 2023 Q1调用python后一直报错1671
2014 浏览 2 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 12:39 , Processed in 1.297881 second(s), Total 110, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3435