我每次向設備發送一個命令,設備回傳一個讀數。我把這段代碼放到一個timer里反復執行,每次在發送命令前和接受讀數后,都清空了輸入輸出快取區。
剛開始一切正常,但過一段時間,就無法接受到讀數了,但是過了一兩個小時重啟程式就又正常了,請問哪位遇到過類似情況,是什么問題(軟體或硬體)引發的,還是說初始化串口時要特殊設定一些引數?
uj5u.com熱心網友回復:
讀數在DataReceived事件里就行uj5u.com熱心網友回復:
建議你開一個多執行緒:
Dim SerialComm = New Threading.Thread(New Threading.ThreadStart(AddressOf Sp_Receiving))
SerialComm.Start() '開執行緒
Private Sub Sp_Receiving()
Dim strIncoming As String
Try
If SerialPort1.BytesToRead > 0 Then
strIncoming = SerialPort1.ReadExisting.ToString '讀取緩沖區中的資料
SerialPort1.DiscardInBuffer()
'strIncoming = SerialPort1.ReadLine.ToString
'SerialPort1.DiscardInBuffer()
'ListBox1.Items.Add(Microsoft.VisualBasic.Left(strIncoming, InStr(strIncoming, vbCr) - 1)) '取到回車符位置數-1
'ListBox1.Items.Add(Mid(strIncoming, 1, Len(strIncoming) - 1)) '長度-1
ListBox1.Items.Add(strIncoming)
ListBox1.SelectedIndex = ListBox1.Items.Count - 1
If ListBox1.Items.Count > 1000 Then
Me.ListBox1.Items.Clear()
End If
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
uj5u.com熱心網友回復:
不確認到底是上位機還是下位機哪里的問題,可以先找一個成熟的串口通信軟體模擬你的定時操作,來判斷到底是哪端的問題,再找解決方案。uj5u.com熱心網友回復:
就類似這樣咯Private WithEvents mPort As SerialPort
Event RequestData()
Event Ready()
Event Interrupt()
Event RerequestData()
Sub New(PortName As String, BaudRate As Integer)
mPort = New SerialPort(PortName, BaudRate)
Try
mPort.Open()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub mPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles mPort.DataReceived
Dim inData As String = CType(sender, SerialPort).ReadLine.TrimEnd({CChar(vbCr), CChar(vbLf)})
If inData = (r_RequestData) Then
RaiseEvent RequestData()
ElseIf inData = (r_Ready) Then
RaiseEvent Ready()
ElseIf inData = (r_Interrupt) Then
RaiseEvent Interrupt()
ElseIf inData = r_RerequestData Then
RaiseEvent RerequestData()
ElseIf inData <> String.Empty Then
Debug.Print("收到下位機的未知請求。[" & inData & "]")
End If
End Sub
Private Sub mPort_Disposed(sender As Object, e As EventArgs) Handles mPort.Disposed
Try
If mPort IsNot Nothing AndAlso mPort.IsOpen Then
Clear()
mPort.Close()
End If
Catch ex As Exception
End Try
End Sub
Protected Friend Sub Clear()
Try
mPort.BaseStream.Flush()
Catch ex As Exception
End Try
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/86335.html
標籤:VB.NET
上一篇:GDI+繪制折線的點數
