概述
大家好,最近我在使用VB.NET开发串口通讯的一点内容,在使用VB.NEI对嵌入式控制器编程,给下位机通讯发命令数据的时候,发现有时候发一次,下位机没有收到,为了增强程序的可靠性,我想延时100毫秒,在发送一次,不知道怎样些延时程序,使用定时器还是有专门的API函数调用,希望有经验的师傅可以给点指点,最好些清楚点,怎样在窗体开头生命API以及如何在需要使用延时程序的地方调用,谢谢
你好,如果我用Sleep() API做延时程序使用,那这种演示会不会影响我在程序中使用的定时器,我要用定时器适时的接收串口数据,另外,如果我要使用Sleep() API,应该怎样在窗体中声明他,谢谢
但我试验了一下,如果用Sleep的时间有阻塞调用(比如用MessageBox.Show("!")却不点击确定按钮),则程序流程很不好。不建议使用Sleep。
现在,我还没看懂你希望的流程。不过我觉得新开一个Timer就差不多了。
你好,在我的程序中有串口的发送和接收,在程序中,我用定时器每隔10毫秒采集一次串口数据,如果我使用Thread.Sleep(100)做延时程序,会不会对我的接收串口数据有影响啊?或者说在延时时间内,我的定时器是不工作的
跟定时器一毛钱关系都没有。
如果你所有对串口的操作在某个按钮方法中写的,你sleep,休眠的是主线程,button的click不退出就不会继续的执行消息循环,也就不会执行到wndproc,而windows.forms.timer这个定时器的原理是有一个中断,到时间就给程序发一个WM_TIMER消息,如果你按钮的事件没退出,不执行消息循环,自然无法处理WM_TIMER消息,窗体是不响应任何操作的。这才是“影响”的原因。
不知道你timer做什么用的。你的思路可能会不太对。
我如果使用sleep延时,如果我延时了1秒钟,那一秒钟内别的事件我都不能响应处理,只能等待一秒钟过后,才能去处理其他的事件,如果在1秒钟内,我又单击了按钮控件,岂不是按钮控件得不到及时的响应啊?
有没有方法让既可以延时,又可以在来了其他的事件的时候,可以跳出延时结构去处理我要处理的事件啊?
我在网络上看到过Thread.Sleep(1000)
DoEvents(保证消息循环)
不知道在延时后面再加上DoEvents(保证消息循环) 是什么有意思?
还有,我在做滤波后,最后输出结果时,我定义了变量a存储最后的数据,变量a的类型是single类型的,在最后输出数据时候,我发现有时候小数后面的位数比较多,怎样做能让我的输出在小数点后只有一位小数啊
网络上说用函数format函数可以实现,但是看了一些帖子试验了一下,也没有找到实用的,希望有经验的师傅指点下
我不知道你的下位机是什么,PLC还是单片机,如果你在发送的时候也在读取数据就有可能收不到,我猜的,如果在不间断的读取下位机的数据时需要写入下位机数据,这是安排不好就出现数据丢失的现象,必须进行排队,还有就是你的下位机最快能接受的速度,如果大于下位机能响应的速度就会丢失,拙见,不要拍砖
最好可以修改下位机,例如可以读出最后发送给它的指令的序号。
至于说循环,应该尽量避免任何小程序中的循环。越是资源紧张的环境,少用线程,使用少量一两个Timer就可以解决一大堆看似并发的程序的时候,可能这种解决方式是首选。
有些操作需要准确地定时执行,有些不需要,这样至少要分开两种Timer来调用它们(或许你对这两种/个Timer有20个事件处理程序)。
数据包是单帧发送的话,一般不是通过上位机重复发数据来处理,而是在通讯协议中增加唤醒指令来处理。下位机在发送数据前,先发个唤醒指令,下位机接收到唤醒指令后,不对数据包进行处理,直接丢弃,只是进入等待接收状态。这样就不会出现楼主所说丢数据的问题了。数据包是多帧发送的话,应该是下位机发现丢帧后,发个指令过来要求上位机重发某一帧(第几帧),而上位机是在通讯协议中通过指令或是标记位告诉下位机当前数据是发后续帧还是重发帧
来源:英超直播
最后
以上就是淡然微笑为你收集整理的VB.NET中串口通讯延时程序的全部内容,希望文章能够帮你解决VB.NET中串口通讯延时程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复