关于VB. net串口通信,小白求助

sa220z 2019-12-09 11:37:14
我每次向设备发送一个命令,设备返回一个读数。我把这段代码放到一个timer里反复执行,每次在发送命令前和接受读数后,都清空了输入输出缓存区。
刚开始一切正常,但过一段时间,就无法接受到读数了,但是过了一两个小时重启程序就又正常了,请问哪位遇到过类似情况,是什么问题(软件或硬件)引发的,还是说初始化串口时要特殊设置一些参数?
...全文
129 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 元老 2019-12-12
  • 打赏
  • 举报
回复
就类似这样咯
   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
良朋 2019-12-09
  • 打赏
  • 举报
回复
建议你开一个多线程:

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


巴士上的邂逅 2019-12-09
  • 打赏
  • 举报
回复
读数在DataReceived事件里就行
subzero 2019-12-09
  • 打赏
  • 举报
回复
不确认到底是上位机还是下位机哪里的问题,可以先找一个成熟的串口通信软件模拟你的定时操作,来判断到底是哪端的问题,再找解决方案。

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧