看板 Visual_Basic 關於我們 聯絡資訊
在程式碼開頭家這個 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