mscomm串口通信求救
本人用mscomm与下位机进行通信,现遇到一个怪现象:
收到的数据一会正常,一会乱码,而且是周期性的
乱码的时候出现?,就是奇偶校验错误,也有其他乱码
我设定的每次收的数据是14字节,但经常会出现28字节乱码一起来,意味着没有收到回车符
这种现象哪位大侠遇到过,急盼指教,谢谢
[解决办法]
你可以通过设置触发mscomm控件的字节数来决定触发mscomm的oncomm事件,进入后可以先关闭下一个oncomm事件的触发,处理完毕后再打开触发即可
[解决办法]
试着改变你的InputMode 属性
comInputModeText 0 (缺省)数据通过 Input 属性以文本形式取回。
comInputModeBinary 1 数据通过 Input 属性以二进制形式取回。
[解决办法]
MSCOMM控件在接收8字长或其倍数时出错概率低,字长在外的经常会有出错,可在接收代码中用
IF THEN
ENDIF
语句来判断:
MSComm1.InputMode = comInputModeText '按ASCII接收
intInputLen = MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = MSComm1.Input
Text1 = bytInput
Text2 = Text1
jscd = Len(Text1)
If Left(Text1, 1) <> Chr(27) Or jscd > 14 Then
frmMain.Label.BackColor = vbRed
frmMain.Label.ForeColor = vbWhite
frmMain.Label.Caption = "接收信号出错! "
ElseIf Left(Text2, 1) = Chr(27) And Mid(Text2, 14, 1) = Chr(13) Then
frmMain.Label.BackColor = vbGreen
frmMain.Label.ForeColor = vbBlack
frmMain.Label.Caption = "接收信号正常! "
If Left(Text2, 1) = Chr(27) And jscd = 14 Then
'插入数据处理代码
End If
End If
将上述代码按你的接收命令格式修改后,放于MSCOMM的MSComm1_OnComm事件的代码中.
[解决办法]
在MSCOMM控件所在窗体的初始化中执行
MSComm1.RThreshold = 14
[解决办法]
Do
With MSComm1
data = " "
Do
Do
DoEvents
Loop Until .InBufferCount > 0 '循环等待接收缓冲区> =3个字节
data = data & .Input
buffer = data
Loop Until buffer(UBound(buffer())) = &H2A
BufBound = UBound(buffer())
'sTem1 = " "
For i = 0 To BufBound '这个大家应该清楚吧,最高位,也就是收到的数据的长度赋值给I
'ReDim stem(UBound(buffer)) As String
'stem2 = stem2 & Right( "00 " & Hex(buffer(i)), 2) '缓存里每两位取出来,并且以“十六进制”的形式加进stem2
'sTem1 = sTem1 & Chr(buffer(i)) '每个字符以字符串的形式加进STEM1
Next i
End With
While BufBound > = 9
If BufBound > = 8 Then
If buffer(BufBound - 8) = &H2 Then
i = buffer(BufBound - 7)
Sampled(i) = True
' Enable(i) = True
MapBuffer = buffer()
BufBound = BufBound - 10
End If
End If
If BufBound > = 12 Then
If buffer(BufBound - 12) = &H4 Then
For i = 1 To 9
If buffer(BufBound - i) = &HFE Then
Enable(10 - i) = False
Else
Enable(10 - i) = True
End If
Next
MapBuffer = buffer()
Frmjiankong.Draw
BufBound = BufBound - 14
End If
End If
Wend
Loop Until MSComm1.PortOpen = False
呵呵
这是我接收硬件的数据
因为数据有2中格式。一种是12位16进制书,一种是14位16进制书