问题描述
我有一个连接在Heidenhain ND221显示屏上的测量设备,该设备可以通过RS232串行数据发送其当前值。我想通过excel vba读取数据以进行一些计算。从数据表中,我知道串行设置(9600,E,7,2),像腻子这样的终端可以正确显示数据:“ -___ x.xxxx”(+/-和值之间有4个空格)
我使用了发现的here
的vba代码#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 3"
Open "COM3:9600,E,7,2" For Binary Access Read Write As #1
transmit$ = Chr(2)
' 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
Input #1,receive$
Debug.Print receive$
On Error GoTo 0
' close the serial port
Debug.Print "Close COM port."
Close #1
Debug.Print "Done."
End Sub
我确实接收到数据,但是在仍然读取前面的4个空格时,它缺少正号或负号。
是串行端口配置还是输入#语句,该如何解决?
我还尝试了Get
和Line Input
,但结果相同。
谢谢!
解决方法
好的,我找到了解决方法。我改变了
input #1,receive$
到
Dim receive As String
receive = String(11," ")
Get #1,receive
直到我在前面添加了两行,Get#语句才显示任何数据。 (我知道数据始终只有11位数字。)
但是,将接收变量初始化为字符串并不能解决Input#语句。
现在唯一的问题是,如果在没有可用数据的情况下尝试接收数据,则代码将冻结。参见here。 例如,如果显示器关闭,则com端口仍然存在并且可以打开。到目前为止,我发现在获取之前无法检查获取是否失败。一旦尝试,就无法停止或超时。