串口下掛1個資料采集設備,16個開關量采集,還有模擬量輸出。使用MSComm1串口1,我現在使用timer輪詢每個開關量輸入通道采集輸入狀態,但在此程序中也需要點擊command1來通過串口發送模擬量輸出資料,請問如何在timer回圈程序中當點擊command1時能停止timer回圈先發送模擬量輸出的資料。如果在command1_click中寫:
timer1.enabled=false
MSComm1.Output = ****
這樣肯定不行。
需要在后面加什么陳述句才能判斷timer1停止后串口中無資料,再發送模擬量輸出的資料呢。
表述不清請諒解,新手。
uj5u.com熱心網友回復:
可以在使Timer控制元件的Enabled屬性False后再發送,發送完后再使Enabled = True。uj5u.com熱心網友回復:
串口通訊是雙方都可以主動發送的。因此,如果你使用同一個串口,不存在定時采集的問題的。你采用定時器,實際上是檢查接收快取中是否已經有進來的資料。
此外,也不存在你可以中斷已經觸發的 Time_On 事件的可能性。timer1.enabled=false 只不過是暫停下一次 Time_On 事件觸發。
比較簡單在做法,是 command1 點擊事件中,也做一下 Time_On 中所做的快取讀取操作。有則取來,無則空走。不必對 Timer 做開關操作。
當然,我更傾向的方式,是利用串口的 MSComm1_On 事件進行進入資料的處理,而不是使用 Timer 定時。這樣的話,在 command1 點擊事件中就不必做任何處理。
uj5u.com熱心網友回復:
VB是單執行緒的,你command1_click事件中不會對timer有影響,你可以把收發的代碼全實作在這個函式中,這樣就好了,除非你用了doevents,那就麻煩大了,搞不好連程式都結束不掉。uj5u.com熱心網友回復:
在timer回圈中是一直往設備發送查詢資料的,因為設備的設定就是必須要發送查詢命令,才會回傳值。是不是相當于mscomm_on事件一直在回圈觸發的。
uj5u.com熱心網友回復:
確實是,我現在的操作就相當于兩執行緒了。因為timer中也是一直回圈在收發資料,所以不能都寫在command中吧。
uj5u.com熱心網友回復:
我現在的解決方法是把command中的事件也寫入timer中了,讓它們一起回圈發送。加一個中間變數,然后再通過command改變中間變數的值,實作接收到command事件里回傳的值。這樣可以解決問題,但串口發送的資料量就變大了,回圈一個周期時間也會變長,如果下掛設備多了的話,回圈周期太不樂觀了。。。uj5u.com熱心網友回復:
你發完之后用do loop,加個計時死等就行了,超過多少時間就算超時,一般100個毫秒就可以算超時了看起來這個函式占用時間挺長,其實正常通訊時,占用的時間很短的,就算超時也不過是0.1秒,而且因為是單執行緒的程式,所以挺安全的。
uj5u.com熱心網友回復:
不用在oncomm事件里等回傳,查詢mscomm控制元件的接收區快取大小就知道有沒有資料了,那個接收應該是有獨立執行緒的,反正VB死等不會影響到它接收資料的。好象是.inputcount吧,記不太清了uj5u.com熱心網友回復:
查詢接收區快取是否清空也會有問題。比如一個timer回圈陳述句剛結束,下個計時開始,此時點擊command時,timer.enabled=false,查詢到的快取區是空的,但timer還是要等下一個計時停止,此刻command中和timer中陳述句同時往串口發資料,就又沖突報錯了。之后加個計時死等倒是可以解決,但總覺得這樣有點浪費時間了。。。
uj5u.com熱心網友回復:
沒事的,死等可以把事情簡化掉,我一直都是這么干的,不然oncomm事件的介入時機也是個問題,除非你是定長資料包,不然事件觸發了,資料也不一定是完整的,還是要花時間等。毫秒級的等待真的很短轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/88064.html
上一篇:批處理如何判斷修改和新增復制檔案夾下所有檔案和子檔案夾
下一篇:如何判斷合并單元格,累加行數值。
