使用VB.net手动从串行端口读取

| 我需要使用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-cause-two-thread -exit-application-request-t2781073.html:   几乎可以肯定,这意味着SerialPort对象   尝试在端口连接后完成对ReadLine的调用   关闭。之所以会发生这种情况,是因为两者之间缺乏同步   可能导致端口关闭的UI事件和后台线程   在执行实际ReadFile的SerialPort对象中   操作(作为委托中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
新代码的问题: IO异常仍然存在。有时在打开应用程序时会触发。即使有所有例外,它仍然没有抓住。 有时会收到所有混乱的数据。例如,ST 0009.80 g显示为.80 gST0009。数据以CrLf结尾,因此我仍然在考虑如何在显示之前重新排列数据。 我知道有一种更好的方法可以做到这一点,我只是想不到一个,或者可能我搜索的不够。     
已邀请:

要回复问题请先登录注册