当前位置:编程学习 > C#/ASP.NET >>

VB.NET中串口通讯延时程序

大家好,最近我在使用VB.NET开发串口通讯的一点内容,在使用VB.NEI对嵌入式控制器编程,给下位机通讯发命令数据的时候,发现有时候发一次,下位机没有收到,为了增强程序的可靠性,我想延时100毫秒,在发送一次,不知道怎样些延时程序,使用定时器还是有专门的API函数调用,希望有经验的师傅可以给点指点,最好些清楚点,怎样在窗体开头生命API以及如何在需要使用延时程序的地方调用,谢谢 --------------------编程问答-------------------- SetTimer() API
Sleep() API --------------------编程问答-------------------- 最好用System.Threading.Thread.Sleep,延时100毫秒:
System.Threading.Thread.Sleep(100)
--------------------编程问答-------------------- 同意ls的观点,用sleep。 --------------------编程问答-------------------- 你好,如果我用Sleep() API做延时程序使用,那这种演示会不会影响我在程序中使用的定时器,我要用定时器适时的接收串口数据,另外,如果我要使用Sleep() API,应该怎样在窗体中声明他,谢谢 --------------------编程问答-------------------- 路过,学习,帮顶 --------------------编程问答--------------------
引用 4 楼 why3213 的回复:
你好,如果我用Sleep() API做延时程序使用,那这种演示会不会影响我在程序中使用的定时器,我要用定时器适时的接收串口数据,另外,如果我要使用Sleep() API,应该怎样在窗体中声明他,谢谢

使用Sleep需要
Imports System.Threading

在想调用的地方用
Thread.Sleep(100)'单位ms

但我试验了一下,如果用Sleep的时间有阻塞调用(比如用MessageBox.Show("!")却不点击确定按钮),则程序流程很不好。不建议使用Sleep。
现在,我还没看懂你希望的流程。不过我觉得新开一个Timer就差不多了。 --------------------编程问答-------------------- 这种情况基本是死读,屏蔽DataRecived事件后。不停的读取。直到超时。
dim tick as integer = environment.tickcount
while environment.tickcount - tick < 100 
    '读数据
    '分析
    '分析成功,则exit while
end while --------------------编程问答-------------------- 你好,在我的程序中有串口的发送和接收,在程序中,我用定时器每隔10毫秒采集一次串口数据,如果我使用Thread.Sleep(100)做延时程序,会不会对我的接收串口数据有影响啊?或者说在延时时间内,我的定时器是不工作的 --------------------编程问答-------------------- 跟定时器一毛钱关系都没有。
如果你所有对串口的操作在某个按钮方法中写的,你sleep,休眠的是主线程,button的click不退出就不会继续的执行消息循环,也就不会执行到wndproc,而windows.forms.timer这个定时器的原理是有一个中断,到时间就给程序发一个WM_TIMER消息,如果你按钮的事件没退出,不执行消息循环,自然无法处理WM_TIMER消息,窗体是不响应任何操作的。这才是“影响”的原因。
不知道你timer做什么用的。你的思路可能会不太对。 --------------------编程问答-------------------- --------------------编程问答-------------------- 你好,李逍遥师傅,能有你的Q吗?
我想和你单独的谈谈,这个程序我比较着急调试,谢谢啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 最好将此操作放在进程里,否则占CPU

用sleep延时 --------------------编程问答--------------------
引用 8 楼 why3213 的回复:
你好,在我的程序中有串口的发送和接收,在程序中,我用定时器每隔10毫秒采集一次串口数据,如果我使用Thread.Sleep(100)做延时程序,会不会对我的接收串口数据有影响啊?或者说在延时时间内,我的定时器是不工作的

据我所知,VB的定时器定时精度在55ms,LZ如何能每用定时器每隔10毫秒采集一次串口数据. --------------------编程问答-------------------- 我如果使用sleep延时,如果我延时了1秒钟,那一秒钟内别的事件我都不能响应处理,只能等待一秒钟过后,才能去处理其他的事件,如果在1秒钟内,我又单击了按钮控件,岂不是按钮控件得不到及时的响应啊?
有没有方法让既可以延时,又可以在来了其他的事件的时候,可以跳出延时结构去处理我要处理的事件啊?
我在网络上看到过Thread.Sleep(1000) 
DoEvents(保证消息循环)  

不知道在延时后面再加上DoEvents(保证消息循环)  是什么有意思?
有用吗? --------------------编程问答-------------------- 还有,我在做滤波后,最后输出结果时,我定义了变量a存储最后的数据,变量a的类型是single类型的,在最后输出数据时候,我发现有时候小数后面的位数比较多,怎样做能让我的输出在小数点后只有一位小数啊
网络上说用函数format函数可以实现,但是看了一些帖子试验了一下,也没有找到实用的,希望有经验的师傅指点下 --------------------编程问答-------------------- 我不知道你的下位机是什么,PLC还是单片机,如果你在发送的时候也在读取数据就有可能收不到,我猜的,如果在不间断的读取下位机的数据时需要写入下位机数据,这是安排不好就出现数据丢失的现象,必须进行排队,还有就是你的下位机最快能接受的速度,如果大于下位机能响应的速度就会丢失,拙见,不要拍砖 --------------------编程问答-------------------- 最好可以修改下位机,例如可以读出最后发送给它的指令的序号。

至于说循环,应该尽量避免任何小程序中的循环。越是资源紧张的环境,少用线程,使用少量一两个Timer就可以解决一大堆看似并发的程序的时候,可能这种解决方式是首选。

有些操作需要准确地定时执行,有些不需要,这样至少要分开两种Timer来调用它们(或许你对这两种/个Timer有20个事件处理程序)。
--------------------编程问答-------------------- sleep是windows自己的延迟函数,不管什么语言都可以用,VB里调用个API就行,网上找下 --------------------编程问答-------------------- 学习中!帮顶! --------------------编程问答--------------------       

System.Threading.Thread.Sleep(100) --------------------编程问答-------------------- 数据包是单帧发送的话,一般不是通过上位机重复发数据来处理,而是在通讯协议中增加唤醒指令来处理。下位机在发送数据前,先发个唤醒指令,下位机接收到唤醒指令后,不对数据包进行处理,直接丢弃,只是进入等待接收状态。这样就不会出现楼主所说丢数据的问题了。数据包是多帧发送的话,应该是下位机发现丢帧后,发个指令过来要求上位机重发某一帧(第几帧),而上位机是在通讯协议中通过指令或是标记位告诉下位机当前数据是发后续帧还是重发帧 --------------------编程问答-------------------- 新人学习,帮顶! --------------------编程问答-------------------- --------------------编程问答-------------------- sleep是会影响定时器控件的,用的多的话,严重影响程序运行时间,可以用for ...next,循环到个几万,也可以当延时 --------------------编程问答-------------------- 路过,学习了 --------------------编程问答--------------------
引用 25 楼 wph1234 的回复:
sleep是会影响定时器控件的,用的多的话,严重影响程序运行时间,可以用for ...next,循环到个几万,也可以当延时

我现在也在做类似的程序,DataReceived自己也是一个监听线程。用for ...next的话不能保证延迟的时间。
关于延迟的好办法 坐等lx高人 --------------------编程问答-------------------- 还没有学习到
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,