1)我认为你的InputLen = 5的用法不妥.
InputLen 属性
设置并返回 Input 属性从接收缓冲区读取的字符数。
InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
2)属性InputMode = comInputModeBinary 是设置接收数据模式为二进制形式,那么你收到的是BYTE数据类型,应由接收代码处理成16进制的字符串来显示.根据传进的数据看是20字长,如果接收数据始终为20字长属性RThreshold建议设为20.
建议你可参考"人民邮电出版社"的"VISUAL BASIC 串扣通信工程开发实例导航"一书,它的第1章 串口调试精灵代码是相当好的代码,消化吸收作修改可解决很多问题.
关于一条一条记录定长进入,我认为应将完整记录集合读入,然后按记录格式给接收到记录且代码判断正确,由其后代码处理.
以下是依据串口调试精灵代码做的MSComm_OnComm事件的代码.我仔细看了其代码,对InputLen属性的用法仅是在关闭串口时使用了缺省值 0.
Private Sub ctrMSComm_OnComm()
Dim bytInput() As Byte
Dim intInputLen As Integer
Dim outputV As Single
Select Case frmMain.ctrMSComm.CommEvent
Case comEvReceive
If blnReceiveFlag Then
If Not frmMain.ctrMSComm.PortOpen Then
frmMain.ctrMSComm.CommPort = intPort
frmMain.ctrMSComm.Settings = strSet
frmMain.ctrMSComm.PortOpen = True
End If
'此处添加处理接收的代码
frmMain.ctrMSComm.InputMode = comInputModeBinary
intInputLen = frmMain.ctrMSComm.InBufferCount
Text3 = intInputLen
ReDim bytInput(intInputLen)
bytInput = frmMain.ctrMSComm.Input
Call InputManage(bytInput, intInputLen)
Call GetDisplayText
'插入处理代码
Text2 = HexStr1
If Mid(HexStr1, 17, 2) >= 80 And Mid(HexStr1, 17, 2) <= 81 Then
If Mid(HexStr1, 17, 2) = "80" Then
blL = Mid(HexStr1, 11, 2)
Call Hex_bin '判别故障
alame(0) = Mid(zt_dm1, 2.1)
dizhi = Val(Mid(HexStr1, 18, 1))
xh = Val(Mid(HexStr1, 20, 1))
outputV = Val("&H" & Mid(HexStr1, 9, 2)) / 2.55
frmYibiao.Label2(dizhi) = Int(outputV)
sj_bm(dizhi, xh) = Val("&H" & Mid(HexStr1, 5, 4)) / 10 '16进制转换为10进制
frmYibiao.Label1(dizhi) = sj_bm(dizhi, xh)
record_jm(0) = Val("&H" & Mid(HexStr1, 1, 4)) / 10
frmYibiao.Label3(dizhi) = record_jm(0) 'Val("&H" & Mid(HexStr1, 5, 4)) / 10
If xh = 2 Then
End If
ElseIf Mid(HexStr1, 17, 2) = "81" Then
blL = Mid(HexStr1, 11, 2)
Call Hex_bin '判别故障
alame(1) = Mid(zt_dm1, 2.1)
dizhi = Val(Mid(HexStr1, 18, 1))
xh = Val(Mid(HexStr1, 20, 1))
outputV = Val("&H" & Mid(HexStr1, 9, 2)) / 2.55
frmYibiao.Label2(dizhi) = Int(outputV)
sj_bm(dizhi, xh) = Val("&H" & Mid(HexStr1, 5, 4)) / 10
frmYibiao.Label1(dizhi) = sj_bm(dizhi, xh)
record_jm(1) = Val("&H" & Mid(HexStr1, 1, 4)) / 10
frmYibiao.Label3(dizhi) = record_jm(1) 'Val("&H" & Mid(HexStr1, 5, 4)) / 10
If xh = 2 Then
End If
End If
Text4 = Val(jieshou_sj) / 10
Text5 = Mid(HexStr1, 17, 2) & Mid(HexStr1, 19, 2) & Text4
End If
Call display
If Val(Text3) >= 10 Then
Call cmdClear_Click
End If
If Not blnAutoSendFlag And Not blnReceiveFlag Then
frmMain.ctrMSComm.PortOpen = False
End If
End If
End Select
End Subhttp://zhidao.baidu.com/question/18050782.html
其它参阅上述网址本人关于串口通信在baidu的答复,希望对你有帮助.祝你成功!
InputLen 属性
设置并返回 Input 属性从接收缓冲区读取的字符数。
InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
2)属性InputMode = comInputModeBinary 是设置接收数据模式为二进制形式,那么你收到的是BYTE数据类型,应由接收代码处理成16进制的字符串来显示.根据传进的数据看是20字长,如果接收数据始终为20字长属性RThreshold建议设为20.
建议你可参考"人民邮电出版社"的"VISUAL BASIC 串扣通信工程开发实例导航"一书,它的第1章 串口调试精灵代码是相当好的代码,消化吸收作修改可解决很多问题.
关于一条一条记录定长进入,我认为应将完整记录集合读入,然后按记录格式给接收到记录且代码判断正确,由其后代码处理.
以下是依据串口调试精灵代码做的MSComm_OnComm事件的代码.我仔细看了其代码,对InputLen属性的用法仅是在关闭串口时使用了缺省值 0.
Private Sub ctrMSComm_OnComm()
Dim bytInput() As Byte
Dim intInputLen As Integer
Dim outputV As Single
Select Case frmMain.ctrMSComm.CommEvent
Case comEvReceive
If blnReceiveFlag Then
If Not frmMain.ctrMSComm.PortOpen Then
frmMain.ctrMSComm.CommPort = intPort
frmMain.ctrMSComm.Settings = strSet
frmMain.ctrMSComm.PortOpen = True
End If
'此处添加处理接收的代码
frmMain.ctrMSComm.InputMode = comInputModeBinary
intInputLen = frmMain.ctrMSComm.InBufferCount
Text3 = intInputLen
ReDim bytInput(intInputLen)
bytInput = frmMain.ctrMSComm.Input
Call InputManage(bytInput, intInputLen)
Call GetDisplayText
'插入处理代码
Text2 = HexStr1
If Mid(HexStr1, 17, 2) >= 80 And Mid(HexStr1, 17, 2) <= 81 Then
If Mid(HexStr1, 17, 2) = "80" Then
blL = Mid(HexStr1, 11, 2)
Call Hex_bin '判别故障
alame(0) = Mid(zt_dm1, 2.1)
dizhi = Val(Mid(HexStr1, 18, 1))
xh = Val(Mid(HexStr1, 20, 1))
outputV = Val("&H" & Mid(HexStr1, 9, 2)) / 2.55
frmYibiao.Label2(dizhi) = Int(outputV)
sj_bm(dizhi, xh) = Val("&H" & Mid(HexStr1, 5, 4)) / 10 '16进制转换为10进制
frmYibiao.Label1(dizhi) = sj_bm(dizhi, xh)
record_jm(0) = Val("&H" & Mid(HexStr1, 1, 4)) / 10
frmYibiao.Label3(dizhi) = record_jm(0) 'Val("&H" & Mid(HexStr1, 5, 4)) / 10
If xh = 2 Then
End If
ElseIf Mid(HexStr1, 17, 2) = "81" Then
blL = Mid(HexStr1, 11, 2)
Call Hex_bin '判别故障
alame(1) = Mid(zt_dm1, 2.1)
dizhi = Val(Mid(HexStr1, 18, 1))
xh = Val(Mid(HexStr1, 20, 1))
outputV = Val("&H" & Mid(HexStr1, 9, 2)) / 2.55
frmYibiao.Label2(dizhi) = Int(outputV)
sj_bm(dizhi, xh) = Val("&H" & Mid(HexStr1, 5, 4)) / 10
frmYibiao.Label1(dizhi) = sj_bm(dizhi, xh)
record_jm(1) = Val("&H" & Mid(HexStr1, 1, 4)) / 10
frmYibiao.Label3(dizhi) = record_jm(1) 'Val("&H" & Mid(HexStr1, 5, 4)) / 10
If xh = 2 Then
End If
End If
Text4 = Val(jieshou_sj) / 10
Text5 = Mid(HexStr1, 17, 2) & Mid(HexStr1, 19, 2) & Text4
End If
Call display
If Val(Text3) >= 10 Then
Call cmdClear_Click
End If
If Not blnAutoSendFlag And Not blnReceiveFlag Then
frmMain.ctrMSComm.PortOpen = False
End If
End If
End Select
End Subhttp://zhidao.baidu.com/question/18050782.html
其它参阅上述网址本人关于串口通信在baidu的答复,希望对你有帮助.祝你成功!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货