VB与单片机的串口通信
PC->MCU每次通信开始字节0XAA,然后MCU->PC 0X5A 0X79
单击联机命令按钮:首先上位机向单片机发送0XAA,上位机如果收到单片机返回的0X5A 0X79,则开始发送联机指令:串头(0XA5,0X67,0X35,0X31,0X31,0X30),0X02,0X20,0X10,0X30,串尾(0XA0),此时上位机如果收到0X35,0X82,0X20,0X10,则表示联机成功
我自己写的代码,通过串口调试助手调试总是收发都不对,现把部分代码贴出来,望高手指点一下Option Explicit
Dim strbuff As String
Dim inbte() As Byte
Dim outdata As Variant
Dim OUT() As Byte
Dim n As Integer
Dim aa(0) As Byte
Dim indata As String
Private Sub Form_Load() '程序初始化
With MSComm1
.CommPort = 1
.Settings = "38400,n,8,1"
.OutBufferCount = 0
.InBufferCount = 0
.RThreshold = 2
.SThreshold = 0
.OutBufferSize = 512
.InBufferSize = 1024
.InputLen = 0
If Not .PortOpen Then '判断通信口是否打开
On Error Resume Next
.PortOpen = True '打开通信口
If Err Then '错误处理
MsgBox "串口被占用或此串口不存在!通信无效!", 16, "错误提示"
Exit Sub
End If
End If
End With
End Sub
Private Sub mnuexit_Click() '退出程序
Dim a
a = MsgBox("您确定要退出系统吗?", vbOKCancel + vbQuestion, "提示")
If a = 1 Then
Unload Me
Else
Exit Sub
End If
End SubPrivate Sub MSComm1_OnComm() '接收事件
Dim I As Integer
Select Case MSComm1.CommEvent
Case 2
strbuff = MSComm1.Input
inbte() = strbuff
For I = 0 To UBound(inbte)
If Len(Hex(inbte(I))) = 1 Then '判断接收字节长度,不够两位补0
indata = indata & "0" & Hex(inbte(I))
Else
indata = indata & Hex(inbte(I))
End If
Next I
MSComm1.InBufferCount = 0
Case Else
End Select
End SubPrivate Sub munconnect_Click() '连机
ReDim OUT(10) As Byte
OUT(0) = &HA5
OUT(1) = &H67
OUT(2) = &H35
OUT(3) = &H31
OUT(4) = &H31
OUT(5) = &H30
OUT(6) = &H2
OUT(7) = &H20
OUT(8) = &H10
OUT(9) = &H30
OUT(10) = &HA0
ReDim inbte(1)
aa(0) = &HAA
MSComm1.Output = aa
If inbte(0) = &H5A And inbte(1) = &H79 Then
MSComm1.Output = OUT
End If
End SubPrivate Sub Timer1_Timer()
aa(0) = &HAA
MSComm1.Output = aa
n = n + 1
If n > 5 And strbuff <> "5A79" Then
Text8.BackColor = vbRed
MsgBox "联机超时!请稍后重试"
Timer1.Enabled = False
Text8.BackColor = &H80000005 n = 0
End If
End Sub
PC->MCU每次通信开始字节0XAA,然后MCU->PC 0X5A 0X79
单击联机命令按钮:首先上位机向单片机发送0XAA,上位机如果收到单片机返回的0X5A 0X79,则开始发送联机指令:串头(0XA5,0X67,0X35,0X31,0X31,0X30),0X02,0X20,0X10,0X30,串尾(0XA0),此时上位机如果收到0X35,0X82,0X20,0X10,则表示联机成功
我自己写的代码,通过串口调试助手调试总是收发都不对,现把部分代码贴出来,望高手指点一下Option Explicit
Dim strbuff As String
Dim inbte() As Byte
Dim outdata As Variant
Dim OUT() As Byte
Dim n As Integer
Dim aa(0) As Byte
Dim indata As String
Private Sub Form_Load() '程序初始化
With MSComm1
.CommPort = 1
.Settings = "38400,n,8,1"
.OutBufferCount = 0
.InBufferCount = 0
.RThreshold = 2
.SThreshold = 0
.OutBufferSize = 512
.InBufferSize = 1024
.InputLen = 0
If Not .PortOpen Then '判断通信口是否打开
On Error Resume Next
.PortOpen = True '打开通信口
If Err Then '错误处理
MsgBox "串口被占用或此串口不存在!通信无效!", 16, "错误提示"
Exit Sub
End If
End If
End With
End Sub
Private Sub mnuexit_Click() '退出程序
Dim a
a = MsgBox("您确定要退出系统吗?", vbOKCancel + vbQuestion, "提示")
If a = 1 Then
Unload Me
Else
Exit Sub
End If
End SubPrivate Sub MSComm1_OnComm() '接收事件
Dim I As Integer
Select Case MSComm1.CommEvent
Case 2
strbuff = MSComm1.Input
inbte() = strbuff
For I = 0 To UBound(inbte)
If Len(Hex(inbte(I))) = 1 Then '判断接收字节长度,不够两位补0
indata = indata & "0" & Hex(inbte(I))
Else
indata = indata & Hex(inbte(I))
End If
Next I
MSComm1.InBufferCount = 0
Case Else
End Select
End SubPrivate Sub munconnect_Click() '连机
ReDim OUT(10) As Byte
OUT(0) = &HA5
OUT(1) = &H67
OUT(2) = &H35
OUT(3) = &H31
OUT(4) = &H31
OUT(5) = &H30
OUT(6) = &H2
OUT(7) = &H20
OUT(8) = &H10
OUT(9) = &H30
OUT(10) = &HA0
ReDim inbte(1)
aa(0) = &HAA
MSComm1.Output = aa
If inbte(0) = &H5A And inbte(1) = &H79 Then
MSComm1.Output = OUT
End If
End SubPrivate Sub Timer1_Timer()
aa(0) = &HAA
MSComm1.Output = aa
n = n + 1
If n > 5 And strbuff <> "5A79" Then
Text8.BackColor = vbRed
MsgBox "联机超时!请稍后重试"
Timer1.Enabled = False
Text8.BackColor = &H80000005 n = 0
End If
End Sub
解决方案 »
- 读图片的问题...请教大虾....
- vsflexgrid 单元格设置问题
- 初级:如何改变textbox的背景色,顶者有份!!!
- 求VB 向浮动菜单添加内容 的函数!
- VB 中关于文本框的问题?
- 十万火急!恳请高手帮忙!
- 我个人在MSN聊天室举办BASIC讲座 为网友提高写代码的水平
- 为什么我在我的form里插入多个text(text数组控件),2个按钮,可是按tab键顺序错乱~
- 偶刚学菜单设计,按确定后,出现“menu 控件数组元素必须有索引”,是怎么回事,是有东东没装吗?
- 在VB中怎样才能把用户的操作录制起来?各路高手快来看看!!!!
- 数组求教,谢谢!!!
- 我有个控件是从摄像头读取图像的,并显示图像,现在要做一个拖动小窗口,可以将图像中的人物脸部圈住,然后抓取图像,请问该如何处理呢?
Dim strbuff As String
Dim inbte() As Byte
Dim outdata As Variant
Dim OUT() As Byte
Dim n As Integer
Dim aa(0) As Byte
Dim indata As String
Dim n1 As IntegerPrivate Sub Command1_Click()
Timer1.Enabled = True
End SubPrivate Sub Form_Load() '程序初始化
With MSComm1
.CommPort = 1
.Settings = "38400,n,8,1"
.OutBufferCount = 0
.InBufferCount = 0
.RThreshold = 1
.InputMode = comInputModeBinary
'.SThreshold = 0
.OutBufferSize = 512
.InBufferSize = 1024
.InputLen = 0
If Not .PortOpen Then '判断通信口是否打开
On Error Resume Next
.PortOpen = True '打开通信口
If Err Then '错误处理
MsgBox "串口被占用或此串口不存在!通信无效!", 16, "错误提示"
Exit Sub
End If
End If
End With
Print MSComm1.CommPort
Text8 = ""
End Sub
Private Sub mnuexit_Click() '退出程序
Dim a
a = MsgBox("您确定要退出系统吗?", vbOKCancel + vbQuestion, "提示")
If a = 1 Then
Unload Me
Else
Exit Sub
End If
End SubPrivate Sub MSComm1_OnComm() '接收事件
Dim I As Integer
Select Case MSComm1.CommEvent
Case 2
strbuff = MSComm1.Input
inbte() = strbuff
For I = 0 To UBound(inbte)
indata = indata & Right("0" & Hex(inbte(I)), 2)
Next I
If Mid(indata, 1, 4) = "5A79" Then
Text1 = indata
indata = ""
Timer1.Enabled = False
Timer2.Enabled = True
ElseIf Mid(indata, 1, 8) = "35822010" Then '0X35,0X82,0X20,0X10
Text8.BackColor = vbGreen
indata = ""
Text8 = "连机OK!"
Timer2.Enabled = False
End If
MSComm1.InBufferCount = 0
Case Else
End Select
End SubPrivate Sub munconnect_Click() '连机
End SubPrivate Sub Timer1_Timer()
aa(0) = &HAA
MSComm1.Output = aa
n = n + 1
If n > 5 Then
Text8.BackColor = vbRed
Text8 = "联机超时!请稍后重试"
Timer1.Enabled = False
Text8.BackColor = &H80000005
n = 0
End If
End SubPrivate Sub Timer2_Timer()
ReDim OUT(10) As Byte
OUT(0) = &HA5
OUT(1) = &H67
OUT(2) = &H35
OUT(3) = &H31
OUT(4) = &H31
OUT(5) = &H30
OUT(6) = &H2
OUT(7) = &H20
OUT(8) = &H10
OUT(9) = &H30
OUT(10) = &HA0
MSComm1.Output = OUT
n1 = n1 + 1
If n1 > 5 Then
Text8.BackColor = vbRed
Text8 = "联机超时!请稍后重试"
Timer1.Enabled = False
Text8.BackColor = &H80000005
n = 0
End If
End Sub
这句我有点看不懂,能解释一下吗
给你的代码没问题,请添加Timer2
并设置
Timer1和Timer2的Enabled属性为False
由
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
执行联机判断