VB串口接收数据不正确?

zhuogirllz 2010-05-04 12:44:00
我用串口调试助手发送读取下位机数据命令:01 03 00 30 00 05 85 C6,
接收到正确的命令:01 03 05 3A 83 12 6F 00 CE E6.
但是,用我自己编写的程序,发送读取下位机数据命令:01 03 00 30 00 05 85 C6,
收到的却是:3F 03 05 3A 3F 12 6F OO 3F 12 3F .
串口属性设置是:MSCOMM1.Settings="38400,E,8,1".
感觉收到的错误数据是跟“偶校验”有关。以前做过类似的项目,都是没有校验的,这次的协议上说是偶校验,所以就改了程序中的MSCOMM1.Settings中的属性设置。其他的程序代码还需要修改吗?或者还需要添加什么代码?
请高手指点!!谢谢啦!
...全文
427 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuogirllz 2010-05-07
  • 打赏
  • 举报
回复
谢谢各位大侠的热心帮助,我的问题解决了,原来是下位机的线接错了。
呵呵!分不多,略表谢意!!
zdingyun 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhuogirllz 的回复:]
下位机的波特率是9600时,用调试助手波特率9600接收不到,必须是38400才可以接收。这是什么原因啊
[/Quote]
LZ:你上下位机间通信协议究竟是如何规定的.如果真如LZ所说下位机的波特率是9600,那上位机也必须设置波特率为9600.
zhuogirllz 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 veron_04 的回复:]
楼主试一试这个,串口调试器源代码,可以参考:http://download.csdn.net/source/1262066
有时波特率过快也会导致错误的接收。
[/Quote]

下位机的波特率是9600时,用调试助手波特率9600接收不到,必须是38400才可以接收。这是什么原因啊
zhuogirllz 2010-05-05
  • 打赏
  • 举报
回复
这个settings=“38400,E,8,1”中的偶校验是什么意思呢?
是表示接收到数据之后,自动进行一次偶校验吗?我们的仪器中说硬件(RS485)是偶校验。对于上位机软件来说,为什么如果设置成“38400,N,8,1”,得到的就是另外错误的一串命令?这个校验位的用途到底体现在哪里呢?
贝隆 2010-05-05
  • 打赏
  • 举报
回复
楼主试一试这个,串口调试器源代码,可以参考:http://download.csdn.net/source/1262066
有时波特率过快也会导致错误的接收。
zdingyun 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhuogirllz 的回复:]
试过了,收到的命令是3F 03 05 3A 3F 12 6F OO 3F 12 3F 。
这个settings=“38400,E,8,1”中的奇偶校验是硬件的校验,还是软件的校验。是不是应该设置成N?
我设置成N之后,收到了FFFF0……
[/Quote]

LZ:
正确的命令:01 03 05 3A 83 12 6F 00 CE E6
错误的命令:3F 03 05 3A 3F 12 6F 00 3F 12 3F

错误的比正确的多1字节.
你的情况确实非常奇特,我这儿无法模拟.

我认为你应从下位机部分查找原因.


zhuogirllz 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zdingyun 的回复:]
请LZ用我在10楼给出的VB工程链接做测试,你需要修改下List2控件的属性设置,添加38400波特率.
[/Quote]

试过了,收到的命令是3F 03 05 3A 3F 12 6F OO 3F 12 3F 。
这个settings=“38400,E,8,1”中的奇偶校验是硬件的校验,还是软件的校验。是不是应该设置成N?
我设置成N之后,收到了FFFF0FFF。(我们这好像是硬件的偶校验。)
贝隆 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhuogirllz 的回复:]
引用 19 楼 veron_04 的回复:
楼主试一试这个,串口调试器源代码,可以参考:http://download.csdn.net/source/1262066
有时波特率过快也会导致错误的接收。


下位机的波特率是9600时,用调试助手波特率9600接收不到,必须是38400才可以接收。这是什么原因啊
[/Quote]
这时因为你的下位机的波特率是38400,串口调试器和下位机必需匹配。
楼主看看关于串口通信的书籍吧,有些基础知识是必需的,磨刀不误砍柴工:
http://download.csdn.net/source/1498637
http://download.csdn.net/source/1498644
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zdingyun 的回复:]
核查下你TIMER控件的时间间隔,不要小于100MS.
[/Quote]
间隔是1000MS
这段代码:
Case Else
'
MsgBox "串口接收事件号:" & MSComm1.CommEvent & "", vbOKOnly + vbCritical, "测试串行口"
,提示错误号1009,说明是检测到硬件校验错误!这说明什么呢?
zdingyun 2010-05-04
  • 打赏
  • 举报
回复
核查下你TIMER控件的时间间隔,不要小于100MS.
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zdingyun 的回复:]
请LZ用我在10楼给出的VB工程链接做测试,你需要修改下List2控件的属性设置,添加38400波特率.
[/Quote]
好的,明天去试。谢谢您!!
今天搞了一天,头都想疼了,但就是不知道问题在哪里。是用同一台电脑试的。
现在开始怀疑是不是发送时出了问题。因为用调试助手都是正常的。
zdingyun 2010-05-04
  • 打赏
  • 举报
回复
请LZ用我在10楼给出的VB工程链接做测试,你需要修改下List2控件的属性设置,添加38400波特率.
zdingyun 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhuogirllz 的回复:]
我用调试助手试过,接收完全没有问题,说明波特率没有偏差吧。也说明下位机的奇偶校验设置没有错误吧。[/Quote]
请问是同一台电脑测试的?

再请LZ用我在10的VB工程做测试,你需要修改下List2控件的属性设置,添加38400波特率.
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zdingyun 的回复:]
看过LZ的代码,无明显错误.
我的意见有两种可能:
1)下位机的时基与LZ电脑的时基有差异,以至实际波特率发生偏差,使得出现如此错误.
2)下位机的奇偶校验设置错误,产生奇偶校验错误.

建议LZ用:http://www.vbgood.com/thread-83700-1-1.html的VB串口调试软件测试下.
[/Quote]

我用调试助手试过,接收完全没有问题,说明波特率没有偏差吧。也说明下位机的奇偶校验设置没有错误吧。
zdingyun 2010-05-04
  • 打赏
  • 举报
回复
看过LZ的代码,无明显错误.
我的意见有两种可能:
1)下位机的时基与LZ电脑的时基有差异,以至实际波特率发生偏差,使得出现如此错误.
2)下位机的奇偶校验设置错误,产生奇偶校验错误.

建议LZ用:http://www.vbgood.com/thread-83700-1-1.html的VB串口调试软件测试下.
of123 2010-05-04
  • 打赏
  • 举报
回复
Private Sub Form_Load()
'*********************************
'串口初始化,并打开串口
Me.MSComm1.CommPort = 1
Me.MSComm1.Settings = "38400,E,8,1"
Me.MSComm1.InputMode = comInputModeBinary
Me.MSComm1.RThreshold = 10 '******************************

Me.MSComm1.PortOpen = True


Me.Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()
Dim InByte() As Byte

'接收实时测量值
Select Case MSComm1.CommEvent

Case comEvReceive

InByte = MSComm1.Input
strdata = ""
For i = 0 To UBound(InByte)
strdata = strdata & Right("0" & Hex(InByte(i)), 2)
Next i
Text2.Text = strdata
'......
End Select
End Sub
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
Dim strdata As String

Private Sub Form_Load()
'*********************************
'串口初始化,并打开串口
Me.MSComm1.CommPort = 1
Me.MSComm1.Settings = "38400,E,8,1"
Me.MSComm1.InputMode = comInputModeBinary
Me.MSComm1.RThreshold = 1

Me.MSComm1.PortOpen = True


Me.Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()


'接收实时测量值
Select Case MSComm1.CommEvent

Case comEvReceive

Dim InByte() As Byte

InByte = MSComm1.Input

For i = 0 To UBound(InByte)
If Len(Hex(InByte(i))) = 1 Then
strdata = strdata & "0" + Hex(InByte(i))
Else
strdata = strdata & Hex(InByte(i))
End If
Next i
Text2.Text = strdata


' '其他事件处理
'
' Case comEvCTS
'
' Case comEvDSR
'
' Case comEvCD
'
' Case comEvRing
'
' Case comEventBreak

' Case Else
'
' MsgBox "串口接收事件号:" & MSComm1.CommEvent & "", vbOKOnly + vbCritical, "测试串行口"

End Select
End Sub

Private Sub Timer1_Timer()
Dim send() As Byte '待传输数据

ReDim send(5) As Byte

send(0) = &H1 '地址
send(1) = &H3 '读取
send(2) = &H0
send(3) = &H30
send(4) = &H0
send(5) = &H5

ReDim Preserve send(0 To 7) As Byte

send(7) = &HC6
send(6) = &H85


Me.MSComm1.OutBufferCount = 0 '清空输出寄存器
Me.MSComm1.Output = send '发送命令

Text1.Text = Hex(send(0)) & "," & Hex(send(1)) & "," & Hex(send(2)) & "," & Hex(send(3)) & "," & Hex(send(4)) & "," & Hex(send(5)) & "," & Hex(send(6)) & "," & Hex(send(7))

End Sub
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
请问一下:通信协议中,规定是否有校验位,在程序代码中是不是只需要设置串口的settings,还有其他需要添加的代码吗?
zhuogirllz 2010-05-04
  • 打赏
  • 举报
回复
什么意思呀?为什么发送的命令一样,接收到的指令却不一样呢。
串口通信中,是否有校验位,我的程序代码中是不是只需要改变MSCOMM1.Settings的设置就可以了呢//?
zdingyun 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhuogirllz 的回复:]
是的,都是偶校验.
不知道问题出在哪里!~因为我用串口调试助手测试,能得到正确的命令代码.
[/Quote]
如果是在同一台电脑出现这样的问题,只能说明LZ程序的代码由BUG.
加载更多回复(4)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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