使用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结尾,因此我仍然在考虑如何在显示之前重新排列数据。
我知道有一种更好的方法可以做到这一点,我只是想不到一个,或者可能我搜索的不够。
没有找到相关结果
已邀请:
0 个回复