上古卷轴5通缉交罚金:vb通过串口读单片机数据有误问题,急!!!1

来源:百度文库 编辑:神马品牌网 时间:2024/05/05 21:47:53
用VB读单片机送上来的数据,总是得不到正确得数据,用串口调试助手就可以收到正确数据,难道同是MSComm,VB得就没有VC得好用?强烈郁闷,那位高手帮忙看看是那里得问题.单片机送上来得是16进制数据,直接显示出来16进制数就可以,一共28个字节,可总是前面几个6,7个字节能对,但有时也是全错,后面得基本没对过,还时常得多字节.....程序如下
还有一问题,不知道为,复制到文本,注释就成乱码了,请高手指教,谢谢
我得QQ49588070,如那位高手帮忙解决了,另开一问,追加送200分,决不食言!

Private Sub Form_Load()
Check1.Value = 1
End Sub

Private Sub Form_Unload(Cancel As Integer)
comm1.PortOpen = False
End Sub

Private Sub MSComm1_OnComm()
Dim Buffer() As Byte '¶¨ÒåÒ»¸ö½ÓÊÕ
Dim i As Long
Dim stem2, sTem1 As String
Dim a As Variant

a = MSComm1.Input
Buffer = a
stem2 = ""
sTem1 = ""
For i = 0 To UBound(Buffer()) '×î¸ß룬Ҳ¾
ReDim stem(UBound(Buffer)) As String

stem2 = stem2 & Right("00" & Hex(Buffer(i)), 2) '»º´æÀï

sTem1 = sTem1 & Chr(Buffer(i)) 'ÿ¸ö
Next i

If Check1.Value = 0 Then
Text1.Text = Text1.Text & sTem1
Else
Text1.Text = Text1.Text & stem2
End If
End Sub
这里为串口初始化,晕,程序发不全
Private Sub Command1_Click() '´ò¿ª¹Ø±Õ´®¿Ú
On Error GoTo CommErr '³ö´íµÄ»°×ªÏò´íÎóÃèÊö
If Command1.Caption = "´ò¿ª´®¿Ú" Then
MSComm1.CommPort = Mid(Combo1.Text, 3, 1)

MSComm1.Settings = "9600,E,8,1"
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
Command1.Caption = "¹Ø±Õ´®¿Ú" '°´
Combo1.Enabled = False '
Else
MsgBox "²»ÄÜ´ò¿ªvbOKOnly, "´íÎó"
End If
Else 'Õâ¸öÊǵ

触发comm的时候,应该加上下面的语句,防止同一时序内被再次触发:

MSComm1.RThreshold = 0 '关闭OnComm事件接收

试试看,有问题再研究。rthrehold改成28是不对的。

给你参考一下前段时间我写的程序,具体的要求在http://wolfccb.spaces.live.com,我现在上不去,你看看吧

Dim av As Variant
Dim datacount As Long

Private Sub cmdClear_Click()
grdData.Clear
End Sub

Private Sub cmdStop_Click()

'关闭端口
If MSComm.PortOpen = True Then
MSComm.InBufferCount = 0 '清空缓冲区
MSComm.PortOpen = False
End If

cmdReceive.Enabled = True
lblStatus.Caption = "停止接收,空闲"

End Sub

Private Sub cmdReceive_Click()

'串口设置
With MSComm
.CommPort = 1
.Settings = "19200,N,8,1" '***** 9600 - 19200
.RThreshold = 1 '接收1字节触发oncomm事件
.InputMode = comInputModeBinary
.InputLen = 1 '输入长度为1
.InBufferCount = 0 '清除接收缓冲区
End With

'打开端口
If MSComm.PortOpen = False Then
MSComm.PortOpen = True
If Err Then
MsgBox (Err.Description)
Exit Sub
End If
End If

lblStatus.Caption = "打开端口,等待接收"
datacount = 0
cmdReceive.Enabled = False
End Sub

Private Sub cmdSave_Click()

Dim outfn As String
Dim i As Long

MsgBox ("接收了" + CStr(datacount) + "组数据")
lblStatus.Caption = "接收完成,请选择输出文件"

cmdReceive.Enabled = True

'选择输出文件
CommonDialog1.FileName = CStr(Date) + ".txt"
CommonDialog1.Filter = "Text Files|*.txt"
CommonDialog1.Flags = CommonDialog1.Flags Or cdlOFNOverwritePrompt
CommonDialog1.CancelError = True
On Error GoTo errhandler
CommonDialog1.ShowSave
outfn = CommonDialog1.FileName

Open outfn For Output As #1
For i = 0 To datacount
Print #1, grdData.TextArray(i)
Next i
Close #1

'txtData.SaveFile outfn
lblStatus.Caption = "输出完成,空闲"

errhandler:
Exit Sub
End Sub

Private Sub Form_Load()
lblStatus.Caption = "空闲"
grdData.ColWidth(0) = 6150
End Sub

Private Sub Form_Unload(Cancel As Integer)

'关闭端口
If MSComm.PortOpen = True Then
MSComm.InBufferCount = 0 '清空缓冲区
MSComm.PortOpen = False
End If

End Sub

Private Sub MSComm_OnComm()
Dim T1, T2 As Long
Select Case MSComm.CommEvent

Case comEvReceive '收到Rthreshold个字节产生的接收事件

MSComm.RThreshold = 0 '关闭OnComm事件接收

lblStatus.Caption = "接收"
av = MSComm.Input '读取一个接收字节
dataframe(1) = av(0) '转换为字节

If dataframe(1) = &HA Then '接收到T1

Do
DoEvents
Loop Until MSComm.InBufferCount >= 4 '循环等待接收缓冲区>=2个字节 '***** 2 - 4

av = MSComm.Input
dataframe(2) = av(0)
av = MSComm.Input
dataframe(3) = av(0) '接收T1
av = MSComm.Input '*****
dataframe(4) = av(0) '*****
av = MSComm.Input '*****
dataframe(5) = av(0) '*****
T1 = dataframe(2) + CLng(dataframe(3)) * 256 + CLng(dataframe(4)) * 65536 + CLng(dataframe(5)) * 16777216 '计算T1 '*****
End If

Do
DoEvents
Loop Until MSComm.InBufferCount >= 1 '循环等待接收缓冲区>=1个字节

av = MSComm.Input '读取一个接收字节
dataframe(6) = av(0) '转换为字节 '***** 4 - 6

'接收到T2
If dataframe(6) = &HA0 Then
'MSComm.RThreshold = 0 '关闭OnComm事件接收

'循环等待接收缓冲区>=2个字节
Do
DoEvents
Loop Until MSComm.InBufferCount >= 4 '***** 2 - 4

av = MSComm.Input
dataframe(7) = av(0)
av = MSComm.Input
dataframe(8) = av(0) '接收T2
av = MSComm.Input '*****
dataframe(9) = av(0) '*****
av = MSComm.Input '*****
dataframe(10) = av(0) '*****
T1 = dataframe(7) + CLng(dataframe(8)) * 256 + CLng(dataframe(9)) * 65536 + CLng(dataframe(10)) * 16777216 '计算T1 '***** 9600

'显示T1 T2 enter
grdData.AddItem (CStr(T1) + " " + CStr(T2))

datacount = datacount + 1 '数据组数+1
End If

MSComm.RThreshold = 1 '打开OnComm事件接收

Case Else

End Select

End Sub

以上。
找的老狼

建议将如下修改成:
MSComm1.RThreshold = 28
另请参阅如下网址:
http://zhidao.baidu.com/question/10521789.html