2009-02-20 153 views
6

從VBA訪問串行端口的最佳方式是什麼?從VBA訪問串行端口的最佳方式是什麼?

我需要一些銷售代表能夠通過串行端口從PowerPoint中的操作按鈕發送一個簡單的字符串。我通常不使用VBA,特別是對於這樣的事情。通常我會把它變成某種應用程序,但我其實並不認爲這個想法很糟糕。這將是他們在投影機上演示此設備並與其他銷售人員和非技術人員交談時的便捷工具。另外,這個銷售人員對VBA或PowerPoint演示文稿進行小小的修改也沒有問題,但對於重新編譯.NET應用程序並不會那麼順利。

我知道我們可以通過從動作演示中運行的批處理文件來完成,但這並不會讓我很開心。我想我們大概可以訪問一個COM對象並從那裏運行,但是我再也不是真正瞭解VBA中使用的最新和最大的庫,並且也很快得到一個快速入門的簡單開篇,發送並關閉連接。

由於這需要在多人的計算機上運行,​​因此如果它可以輕鬆地移植到其他機器上將會很好。我應該可以說它必須在Office 2007和Windows XP上運行。與其他任何東西的兼容性將是一個不錯的獎勵。

我應該如何處理這個問題?任何好的提示或技巧?圖書館建議?

回答

11

Win32 API將串行端口作爲文件處理。您可以通過從VBA中調用這些API函數來直接訪問串行端口。我必須爲舊的.NET應用程序執行此操作,但VBA也不例外。

而不是在這個網站上爲你散列它,這裏是我多年來一直引用的一個參考。 How to perform serial port communications in VBA

+0

+1對於有實例的網站。 – Oorang 2009-06-02 18:47:57

0
Sub Stinky() 
Dim COM_Byte As Byte 
Dim Received_Lines As Long 
Dim Input_Buffer As String 
Dim Output_Buffer As String 
Dim Chars2Send As Long 
Dim CharsRemaining As Long 
Dim lfsr As Long 
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1 
    Input_Buffer = "" 
    CharsRemaining = 0 
    Do 
    Get #1, , COM_Byte 
    If COM_Byte Then 
     If COM_Byte = 13 Then   ' look for CR line termination 
      Debug.Print Input_Buffer, Now ' print it 
      Input_Buffer = ""    ' and clear input buffer 
     ' generate some output (9 characters) 
      lfsr = &H3FFFFFFF - 2^(Received_Lines And 15) 
      Output_Buffer = "[email protected]@@@@@@@" 
      Chars2Send = 9 
      CharsRemaining = 9 
      For j = 0 To 2 
       Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr/32^(2 - j)))) 
      Next j 
      Debug.Print Output_Buffer 
     ' show what I generated 
      Received_Lines = Received_Lines + 1 ' keep track of received line count 
     Else 
      Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer 
     ' process any characters to send 
      If CharsRemaining Then 
       CharsRemaining = CharsRemaining - 1 
       COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1)) 
       Put #1, , COM_Byte 
      End If 
     End If 
    End If 
    DoEvents 
    Loop 
    Close 
End Sub 

這對我有用。我不確定OPEN是否實際設置了波特率,因爲我第一次使用TeraTerm。 我的COM端口是與BASYS3原型套件的USB連接。它在9600處噴射字符,以CR結尾的36個字符的記錄。我可以隨意發送9個字符的命令。在上面的代碼中,我每次收到一個新行時都會生成這些命令字符串。 我選擇發送哪個字符的方式有點笨拙:也許更好的方法是有一個字符指針和一些字符,當這些字符都相等時將它們設置爲零。

+0

如果COM端口以隨機方式打開,看起來EOF會告訴你何時有字符可以接收。這意味着可能會收到空字符。 EOF表示沒有人物在等待。 – 2017-01-16 16:36:27

相關問題