1

我需要使用 RS232 连接到 AND GF 3000 电子秤。我已经使用 HyperT 和 AND 自己的程序测试了连接并且它正在工作。现在我正在创建一个 VB 应用程序来读取这个东西,到目前为止它实际上正在工作。然而,它在几个部分有很多问题,所以我想优化它。

我之前的读取命令使用:

Private Sub mscport_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mscport.DataReceived
    Dim tmpBuf As String
    tmpBuf = mscport.ReadLine
End Sub

这不是我正在使用的完整版本,但可以正常工作。但是,退出并重新连接(我使用的是 Windows 窗体控件)会发现“由于线程退出或应用程序请求,I/O 操作已中止”异常。环顾网络,我从 Dick Grier 那里找到了原因:http ://www.pcreview.co.uk/forums/serial-port-error-o-operation-has-been-abortedbecause-either-thread-退出应用程序请求 t2781073.html

几乎可以肯定,这意味着 SerialPort 对象试图在端口关闭后完成对 ReadLine 的调用。发生这种情况的原因可能是 UI 事件之间缺乏同步,这可能导致端口关闭,而 SerialPort 对象中正在执行实际 ReadFile 操作的后台线程(这是由于委托中的 ReadLine 而执行的)。

ReadLine 的问题以及我不使用它的原因是它会阻塞,直到出现线路终止条件——这可能是在您关闭端口之后。因此例外。

我更喜欢简单地将我自己的数据缓冲在静态或类级变量中(所有 ReadExisting 并将新数据附加到缓冲区),并测试该缓冲区的 vbCrLf 终止字符。如果找到 vbCrLf(InStr 或 Substring,您的选择),则调用委托来处理和显示缓冲区中的数据。请记住在处理并显示其内容后清除此缓冲区。如果这样做,则应解决异常。

迪克

以前我的应用程序使用 ReadExisting 而不是 ReadLine 进行串行连接。后来,当使用 USB 串行电缆时,ReadExisting 不起作用,所以我改用了 ReadLine。我想使用 USB 电缆,所以我需要找到一种方法来替换 ReadLine。现在我对串行端口并没有很大的震动,但我已经设法使用 ReadChar 制作了一个几乎可以工作的代码来替换 ReadLine ,它在这里:

Private Sub mscport_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mscport.DataReceived

    Dim tmpbuf As String
    Dim bytebuffer(17) As Byte
    Dim count As Integer = 17
    Try
        While count > 0
            bytebuffer(17 - count) = mscport.ReadChar
            'If bytebuffer(17 - count) = vbCrLf Then

            'End If
            'tmpBuf = tmpBuf & mscport.ReadExisting
            count = count - 1
        End While

    Catch ex As InvalidOperationException
        MessageBox.Show(ex.Message)
    Catch ex As UnauthorizedAccessException
        MessageBox.Show(ex.Message)
    Catch ex As System.IO.IOException
        MessageBox.Show(ex.Message)

    End Try
    tmpbuf = tmpbuf & System.Text.Encoding.ASCII.GetString(bytebuffer, 0, 17)
    'tmpBuf = bytebuffer.ToString()
    ReceiveData(tmpbuf)
End Sub

新代码的问题:

  1. IO异常仍然存在。有时它会在打开应用程序时触发。即使有所有这些例外,它仍然没有抓住。

  2. 收到的数据有时会很混乱。例如,ST 0009.80 g 显示为 .80 gST 0009。数据以 CrLf 结尾,所以我仍在考虑如何在显示之前重新排列它。

我知道有更好的方法可以做到这一点,我只是想不出一个,或者我搜索的不够多。

4

0 回答 0