2009-02-20 125 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