VB.NET中串口通訊延時程序

大家好,最近我在使用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個事件處理程序)。
數據包是單幀發送的話,一般不是通過上位機重複發數據來處理,而是在通訊協議中增加喚醒指令來處理。下位機在發送數據前,先發個喚醒指令,下位機接收到喚醒指令後,不對數據包進行處理,直接丟棄,只是進入等待接收狀態。這樣就不會出現樓主所說丟數據的問題了。數據包是多幀發送的話,應該是下位機發現丟幀後,發個指令過來要求上位機重發某一幀(第幾幀),而上位機是在通訊協議中通過指令或是標記位告訴下位機當前數據是發後續幀還是重發幀

來源:英超直播

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章