丢失/丢失的第一个字符从COM端口读取数据到Excel

问题描述

我有一个连接在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个空格时,它缺少正号或负号。 是串行端口配置还是输入#语句,该如何解决? 我还尝试了GetLine Input,但结果相同。

谢谢!

解决方法

好的,我找到了解决方法。我改变了

input #1,receive$

Dim receive As String
receive = String(11," ")
Get #1,receive

直到我在前面添加了两行,Get#语句才显示任何数据。 (我知道数据始终只有11位数字。)

但是,将接收变量初始化为字符串并不能解决Input#语句。

现在唯一的问题是,如果在没有可用数据的情况下尝试接收数据,则代码将冻结。参见here。 例如,如果显示器关闭,则com端口仍然存在并且可以打开。到目前为止,我发现在获取之前无法检查获取是否失败。一旦尝试,就无法停止或超时。