从VBA访问串口的最佳方法是什么?
我需要一些销售代表能够通过PowerPoint中的操作按钮在串口上发送一个简单的字符串。我通常不使用VBA,特别是对于这样的事情。通常我会把它变成某种应用程序,但我实际上并不认为这个想法很糟糕。这将是一个方便的工具,他们可以在投影仪上演示这个设备,并与其他销售人员和非技术人员交谈。此外,这个销售人员对VBA或PowerPoint演示文稿进行少量修改没有问题,但重新编译.NET应用程序时也不会这样做。
我知道我们可以通过从动作演示文稿中运行的批处理文件来完成它,但这并不能让我感到非常高兴。我想我们可以访问一个COM对象并从那里运行,但是我再也没有真正了解在VBA中使用的最新和最好的库,并且如何轻松打开一个快速的小引物也很好,发送和关闭连接。
由于这需要在多人的计算机上运行,如果它可以轻松地传输到其他计算机,那将是很好的。我应该可以说它必须在Office 2007和Windows XP上运行。与其他任何东西的兼容性都是一个很好的奖励。
我该如何处理?任何好的提示或技巧?图书馆建议?
答案 0 :(得分:11)
Win32 API将串行端口作为文件处理。您可以通过在VBA中调用这些API函数来直接访问串行端口。我必须为旧的.NET应用程序执行此操作,但VBA也不例外。
不是在这个网站上为你散列,而是这些年来我一直挂着的参考资料。 How to perform serial port communications in VBA
答案 1 :(得分: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 = "?@@@@@@@@"
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,36个字符的记录以CR结尾。我可以随机发送9个字符的命令。在上面的代码中,每次收到新行时都会生成这些命令字符串。 我选择发送哪个字符的方式有点笨重:也许更好的方法是使用字符指针和一些字符,当这些字符相等时将它们都设置为零。
答案 2 :(得分:0)
这里是VBA代码的简短模块,可以在PC串行端口上发送和接收消息。这不是很优雅,但是很简单,应该可以在现代版本的Excel和Windows中使用。
您可以独自扩展功能,以及存储或解析消息。这只是显示了处理串行端口的低级内容。
前5行声明了毫秒级的“睡眠”库函数(基于Excel版本)。
SerialPort()子例程概述了打开端口,传输一些数据,接收一些数据,再次尝试接收一些数据的步骤(以表明它确实不会违反“文件结尾”错误),并关闭端口。
#If VBA7 Then ' Excel 2010 or later
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else ' Excel 2007 or earlier
Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If
Public Sub SerialPort()
' open a COM port, transmit a message, gather results, close the port.
' open the COM port as file #1
Debug.Print "Open COM port 4"
Open "COM4:115200,N,8,1" For Binary Access Read Write As #1
transmit$ = Chr(2) + "Hello, World." + Chr(13)
receiveDummy$ = "~~~"
' transmit a message
Put #1, , transmit$
Debug.Print "Message sent."
' wait a bit for a response
Sleep 100
' check for received message
Debug.Print "Look for incoming message."
On Error Resume Next
Do While True
receive$ = receiveDummy$ 'dummy value
Input #1, receive$
If receive$ = receiveDummy$ Then Exit Do 'the string didn't change, so move on
Debug.Print receive$
Loop
On Error GoTo 0
' do it again to show that the empty input queue doesn't stop the flow
Debug.Print "Look again for incoming message (should not stop on error)."
On Error Resume Next
Do While True
receive$ = receiveDummy$ 'dummy value
Input #1, receive$
If receive$ = receiveDummy$ Then Exit Do 'the string didn't change, so move on
Debug.Print receive$
Loop
On Error GoTo 0
' close the serial port
Debug.Print "Close COM port."
Close #1
Debug.Print "Done."
End Sub