在程式碼開頭家這個
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
※ 引述《dj5115 (阿文)》之銘言:
: 各位高手們!!
: 我設定了一個Command1~4程式內容是一樣的
: 但是無法製程.EXE
: 不知道問題錯再哪裡
: Private Sub Command1_Click()
: Tex1.Text = "連線中" (這裡有改過所以不打t沒問題)
: MSComm1.Output = "1"
: delayms 100 (錯在這裡)
改成Sleep 100
: buf = MSComm1.Input
: If buf = "0" Then
: LOAD1.FillColor = RGB(0, 255, 0)
: ElseIf buf = "1" Then
: LOAD1.FillColor = RGB(255, 0, 0)
: Else
: Tex1.Text = "連線失敗"
: End If
: End Sub
: 它只出現"編譯錯誤:沒有定義這個Sub或Function"
: 請各位幫幫忙!!謝謝
=====================
這樣雖然程式可以跑但是有些東西是假指令
=====================
: Private Sub Command1_Click()
: Tex1.Text = "連線中"
: MSComm1.Output = "1"
: Sleep 100
: buf = MSComm1.Input
你雖然改變了顯示文件又送出了資料,卻沒有任何的實質等待
Sleep這個Function就如其名是真的[睡]了
程式在Sleep時間不會有任何處理與回應,這代表
1.你送出改變文字卻沒有讓畫面更新,所以這個 "連線中" 並沒有發生實質意義
等使用者看到這個字樣,已經是Sub Command1_Click結束以後的事情了
2.因為對MSComm1送出資料之後立刻Sleep,Sleep狀態下程式是沒有動作的
可能甚至連要送出的資料都還沒送就Sleep了
光要解決上面這兩個問題,通常的方法就是加 DoEvents()
不過有時候只有一個DoEvents不一定保證資料真的已經出去了
另外
3.你的程式將停止回應,在Sleep期間
雖然100毫秒轉瞬即逝,但是對視覺呈現還是有影響
=====================
建議的寫法:
Tex1.Text = "連線中"
MSComm1.Output = "1"
TimerStart = 現在時間
Do Until MSComm1.有資料進來 或 (現在時間-TimerStart > 100)
DoEvents()
Sleep(1)
Loop
buf = MSComm1.Input
====================
此外,為了避免Comm中有之前通信留下的資料
在開始連線檢查前應該先將接收快取清空
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.180.163