微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > Labview > 求助!LABVIEW读取串口返回命令,字符丢失

求助!LABVIEW读取串口返回命令,字符丢失

时间:10-02 整理:3721RD 点击:
各位大神你们好,采用LABVIEW串口与下位机MCU通信,每60sMCU回复一个CHARGE_OVER#的字符串,LABVIEW串口接受该字符串,方法是,当字节数达到7个以上时,开始读取串口缓存,但是结果总是丢后面的字符,读到的都是CHARGE_O或是CHARGE_OVE,具体代码见截图,望大神指点,谢谢。


你用串口助手收mcu的会出现这个情况吗?还有串口助手发labview收回出现这个labview接收不完全吗?

尝试Byte at port和read之间 或者 read之前 加一个5ms或者10ms的延时

1、看看串口配置是不是启用了终止符2、可以尝试多读一次看看会不会把丢掉的读出来

用串口助手调试过,没有出现,所以我只能觉得是LABVIEW接受的问题了。

后来,我尝试把等待字节数的WHILE循环时间改为50ms刷新一次,并且在读取之前添加了100ms的延迟,因为波特率时9600,100ms的延迟肯定够了,还是出现了读取不完整的情况。

终止符没有启用,是F,在这里,多读一次,怎么理解,是把WHILE的循环时间变短吗?

1、首先确认一下发送过来的数据是否完成的存入了缓存,可以将后面的清空缓存函数去掉看一下是否所有数据进入了缓存。
2、while循环使用这么高的延时并不是一个明智的选择。
3、如果全部数据已经进入了缓存,可采用判断终止符的方式来结束read函数。

第一条可以尝试一下,第二条循环时间对读取是否有影响,不太明白,短肯定是扫描频繁,但也没能改进问题,第3条对于终止符,我理解的是在串口配置函数,启动终止符,疑惑为什么串口读取函数,没有像写入函数一样,可以采用属性节点,配置为终止符读取,且终止符可以是自行设置,而不是固定为OA。读取函数的属性节点貌似只有字节数.....

这种写法会导致只要传过来字符就要去读,但是可能会发生刚一有字符进来可能还没完全接收就去读了。如果传过来的字符是固定的 那么可不可以将while循环的终止条件那个大于1改为大于12(就是所有字符数),保证全部字节出来了再去读

终止符可自行编辑代码去校验,当缓存区有数据时,就读取,直至缓存中所有的数据都被读出后才停止读取,然后再拿一次所有的数据进行校验。

或者在读取的地方加一个循环 不停地读直到读到#为止 并且限定一个时间比如三分钟还没读到#那就退出循环显示读取失败

两个问题:
1.执行读取动作的条件有问题,你写的是当port口字节数大于1就开始读,你在读的过程这个值会减小,可能小于或等于1.
2.读取到的换成区字符串要用连接字符串指令,因为读到的缓冲区字符可能不是连续的,所以要用连接字符串,要转一下。

改了代码,在字节数与读取之间加100ms延迟,其实是没有用的,因为字节数长度时12个字节,当大于7个时,按照数据流,再延迟100ms,while循环也不会重新扫描,大于7个就会开始读取,当时的字节数就很有可能是8个;

新代码


问题如果解决了麻烦选一下最佳答案吧

将缓存的字符串拼接在一起,这个方案正在尝试,代码还没想好怎么写,里面循环太多了,程序结构需要优化。

我只是路过打酱油的,嘿嘿

可能的错误:
1,你那个代码不应该大于7才去读,把7改成0
2,你用了一个case去比较读到的代码做校验,那么一旦小于7了,你case输出的字符串是什么?校验还能通过吗?
3,建议采用移位寄存器的方式进行存储。

以这种方式尝试,代码写出来不好,多层循环嵌套,而且,通过WHILE循环缓存字符串成数组,这个嵌套的while循环退出机制是什么?因为while循环退出后才能把缓存的数组进行字符串拼接,判断是否有#,拼接字符串和判断都在while循环外,无法停止while循环,程序陷入死循环。


已改成0,困难在于如何把多次读取的字符串缓存,然后拼接字符串,再对字符串进行判断,代码写起来困难了。

用移位寄存器进行拼接

用移位寄存器进行拼接

以图中代码为例,加了while循环,为了缓存,但是这个while无合理的退出机制,因为外层循环是判断都要了#停止读取,最内层的while就无法停止,如果不加while,就无法缓存,后面也无法拼接字符串,这里面共三个循环,用于缓存的内层while循环貌似无法退出....


你这个移位寄存器写的相当另类,建议看一下Labview基础教程或者宝典

以上图为例,移位寄存器放在哪里?用while循环还是for循环?不管内层还是外层,都不能解决while退出机制,如果用for循环,不能实现缓存的作用。

,好吧,去看看

不明白这个另类在哪里?前面一个移位寄存器是数组插入,缓存字符串,后面一个移位寄存器,是吧字符串数组转换成字符串,相当于拼接

另外,从另一个角度来想,如果你的发送端没有问题且数据是一次性发送的话,我觉得下面这段代码已经可以帮你完整的接收数据了。



这个我试试吧,波特率9600,延迟100ms足够了

昨天调试了很多次,LABVIEW与mcu是异步通信,while循环100Ms扫描一次,其实也有可能出现,当正在读的时候,下位机正在发,会出现CHARGE_OVER#被拆分成2次发送的情况,昨天调试,获取的串口信息,就显示出这个字符串被分成了2次发送,异步通信导致。

这个建议只能假设下位机是一次性发出,因为读取在while循环里,如果有字节后开始读取,后面延迟多久,都是没有意义的,因为按照数据流,while循环走到第一个字节属性处,延迟之后的字节数与延迟之前其实没有区别,因为while循环不会在延迟的时间内重新再次扫描,字节数不会有所增加

你这个理解让我觉得很奇怪。你觉得9600的波特率发送5个字符需要多少时间?
你能保证while循环内在执行byte at point的时候,所有数据都发送完了吗?都读到缓存区了吗?

学会使用生产者-消费者模式去读串口数据,大体思路是先用生产者循环读取串口,并将所读数据放入队列, 再用消费者循环去解析队列中的数据。不过,从小编之前的代码上看,这可能超出了LZ的能力。

改成大于0也没用,我以前叶遇到过的

这个我也写过,我接受的数据达到30字节,还有过这种情况

那你怎么解决的?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top