真的用过serialport类的老大,请帮忙指点一下

peipeter007 2008-12-22 11:18:53
我在使用serialport时出现些问题,请大家提供些帮助。
程序设计的思路是用串口连接一台单片机,上位机对单片机进行定时查询,单片机返回当前DI和其他端口的状态,如果检测到DI的某一位发生变化,在将对应的DO状态,发送到单片机。
如:Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'Button1_Click(Nothing, Nothing)
Dim byteData As Byte() = New Byte(4) {}
byteData(0) = &H32
byteData(1) = &H1
byteData(2) = &H0
byteData(3) = &H0
byteData(4) = &H33


Try
If SerialPort1.IsOpen = False Then
SerialPort1.Open()
End If
SerialPort1.Write(byteData, 0, 5)
Catch ex As Exception
MsgBox("1 " & ex.Message)
End Try

End Sub
...全文
61 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxiaopeng306 2009-01-05
  • 打赏
  • 举报
回复
这个问题我也想了很久.希望有高人提点一下.
leitin 2008-12-23
  • 打赏
  • 举报
回复
存在invoke时,你要注意timer的操作顺序
dataarrive时,invoke未运行结束时,timer操作不能
peipeter007 2008-12-22
  • 打赏
  • 举报
回复
问题就是,查询命令和控制命令可能相对同时发送,造成竞争,导致发送命令没有成功,串口也就收不到数据。我尝试在发送控制命令的时候,将定时器停止,待发送完成后在打开,实际有一定效果,但感觉不稳定,会出现查询命令不能定时发送。
哪位大侠做过这样的工作,可以和我分享一下吗,到底采用什么机制才可以准确稳定的运行。谢谢
peipeter007 2008-12-22
  • 打赏
  • 举报
回复
Private Sub DisplayResults(ByVal s As String, ByVal strCount2 As String, ByVal databyte() As Byte)
Dim byteData As Byte() = New Byte(4) {}
If DITranslate(databyte(4)) And &H1 Then
bispaperbreak = True
If prepaperbreak = False Then
byteData(0) = &H31
byteData(1) = &H1
byteData(2) = &H1
byteData(3) = &H1B
byteData(4) = CInt(byteData(0)) + CInt(byteData(1)) + CInt(byteData(2)) + CInt(byteData(3)) Mod 256
prepaperbreak = True
'Timer1.Stop()
Timer1.Enabled = False
Try
If SerialPort1.IsOpen = False Then
SerialPort1.Open()
End If
'SerialPort1.DiscardInBuffer()
' SerialPort1.DiscardOutBuffer()

SerialPort1.Write(byteData, 0, 5)

Timer1.Enabled = True
Catch ex As Exception
MsgBox("3" & ex.Message)
End Try
End If

Else
bispaperbreak = False
If prepaperbreak = True Then
byteData(0) = &H31
byteData(1) = &H1
byteData(2) = &H1
byteData(3) = &H15
byteData(4) = CInt(byteData(0)) + CInt(byteData(1)) + CInt(byteData(2)) + CInt(byteData(3)) Mod 256
prepaperbreak = False

Timer1.Enabled = False
Try
If SerialPort1.IsOpen = False Then
SerialPort1.Open()
End If

SerialPort1.Write(byteData, 0, 5)


Timer1.Enabled = True

Catch ex As Exception
MsgBox("3" & ex.Message)
End Try
End If
End If

End Sub
peipeter007 2008-12-22
  • 打赏
  • 举报
回复
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim display As New Display(AddressOf DisplayResults)
'Dim s As String = String.Empty

Dim i As Integer

'''2222222222222222222222222222222
s = ""

databyte(num) = SerialPort1.ReadByte()
num += 1
If num = 8 Then
If databyte(7) = (CInt(databyte(0)) + CInt(databyte(1)) + CInt(databyte(2)) + CInt(databyte(3)) + CInt(databyte(4)) + CInt(databyte(5)) + CInt(databyte(6)) Mod 256) Then
s = Hex(databyte(0)) & " " & Hex(databyte(1)) & " " & Hex(databyte(2)) & " " & Hex(databyte(3)) _
& " " & Hex(databyte(4)) & " " & Hex(databyte(5)) & " " & Hex(databyte(6)) & " " & Hex(databyte(7))
count += 1


Me.Invoke(display, New Object() {s, CStr(count), databyte})

Else
's = "错误"
SerialPort1.DiscardInBuffer()

errorcount += 1
'Me.Invoke(display, New Object() {s, CStr("********"), False})

End If
num = 0

End If

16,721

社区成员

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

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