大体程序如下,设计时约定:先发送&HAA再发送所选择的单片机号,然后等待所选的单片机将 单片机号返回,如一致然后发送&H00请求所要接收的数据长度,接收完数据长度后开始接收数 据,数据接收完毕后做校验,成功则发送&H02结束一次过程。程序中未对单片机号做判断。 Private Sub cmdStart_Click() Dim byOutput(1 To 1) As Byte MSComm1.Settings = "57600,m,8,1" byOutput(1) = &HAA MSComm1.Output = byOutput '发送字节&HAA给单片机让片机做好准备 MSComm1.RThreshold = 1 '设置接收阀值 iProgramNum = 1 '令iProgramNum=1,执行第一段程序 'MSComm1.Settings = "57600,m,8,1" byOutput(1) = val(txtChipSelect.Text) '选择单片机 MSComm1.Output = byOutput '发送单片机号给单片机让选择单片机做好准备 MSComm1.Settings = "57600,n,8,1" End SubPrivate Sub Form_Load() MSComm1.PortOpen = True '部分参数直接在控件属情列表里改了 MSComm1.Settings = "57600,m,8,1" iProgramNum = 0 End SubPrivate Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive Dim byInput() As Byte Dim byOutput(1 To 1) As Byte Dim byArray(1 To 200) As Byte Dim iTemp As Integer Dim iPos As Integer Dim byTemp As Byte
If iProgramNum = 1 Then 'Case '接收芯片型号判断是否正确选片,如正确则发送00请求数据长度并将iProgramNum改为2 MSComm1.Settings = "57600,n,8,1" byInput = MSComm1.Input '则发送00请求数据长度并将iProgramNum改为2 For iTemp = LBound(byInput) To UBound(byInput) byTemp = byInput(iTemp) 'byTemp中放的为单片机的编号 Next iTemp txtShow.Text = "当前单片机为:" & Val(byTemp) & Space(1) iProgramNum = 2 '注意这一点,执行这些语句后准备开始接收数据块长度 byOutput(1) = &H0 MSComm1.Output = byOutput '发送&H00表示请求数据长度
ElseIf iProgramNum = 3 Then 'Case '读入数据及校验位,校验并显示,然后发送&H02改变Settings使程序可以进入下一个数据传送过程 If MSComm1.InBufferCount >= 23 Then iPos = 1 MSComm1.Settings = "57600,n,8,1" byInput = MSComm1.Input '这句容易forget,此时程序常常会提示"下标越界" For iTemp = LBound(byInput) To UBound(byInput) 'byArray(iDataLength+1)放的为校验码 byArray(iPos) = byInput(iTemp) iPos = iPos + 1 txtShow.Text = txtShow.Text & Chr(byInput(iTemp)) Next iTemp byOutput(1) = &H2 MSComm1.Output = byOutput '做校验 byTemp = 0 For iTemp = 1 To iDataLength byTemp = (Val(byTemp) + byArray(iTemp)) And &HFF Next iTemp If byTemp = byArray(iDataLength + 1) Then txtShow.Text = txtShow.Text & "校验位正确" & Space(1) & byTemp End If
Else: 'varTemp = MsgBox("输入数据未完整,等待...", vbInformation, "system info") 'test End If 'iTemp = MsgBox("End of iProgramNum=3", vbInformation, "程序测试提示") 'for test only
Else: iTemp = MsgBox("iProgramNum=" & iProgramNum & "未定义", vbInformation, "程序测试提示") End If 'Case End Select End Sub
单片机号返回,如一致然后发送&H00请求所要接收的数据长度,接收完数据长度后开始接收数
据,数据接收完毕后做校验,成功则发送&H02结束一次过程。程序中未对单片机号做判断。
Private Sub cmdStart_Click()
Dim byOutput(1 To 1) As Byte
MSComm1.Settings = "57600,m,8,1"
byOutput(1) = &HAA
MSComm1.Output = byOutput '发送字节&HAA给单片机让片机做好准备
MSComm1.RThreshold = 1 '设置接收阀值
iProgramNum = 1 '令iProgramNum=1,执行第一段程序
'MSComm1.Settings = "57600,m,8,1"
byOutput(1) = val(txtChipSelect.Text) '选择单片机
MSComm1.Output = byOutput '发送单片机号给单片机让选择单片机做好准备
MSComm1.Settings = "57600,n,8,1"
End SubPrivate Sub Form_Load()
MSComm1.PortOpen = True '部分参数直接在控件属情列表里改了
MSComm1.Settings = "57600,m,8,1"
iProgramNum = 0
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Dim byInput() As Byte
Dim byOutput(1 To 1) As Byte
Dim byArray(1 To 200) As Byte
Dim iTemp As Integer
Dim iPos As Integer
Dim byTemp As Byte
If iProgramNum = 1 Then 'Case
'接收芯片型号判断是否正确选片,如正确则发送00请求数据长度并将iProgramNum改为2
MSComm1.Settings = "57600,n,8,1"
byInput = MSComm1.Input '则发送00请求数据长度并将iProgramNum改为2
For iTemp = LBound(byInput) To UBound(byInput)
byTemp = byInput(iTemp) 'byTemp中放的为单片机的编号
Next iTemp
txtShow.Text = "当前单片机为:" & Val(byTemp) & Space(1)
iProgramNum = 2 '注意这一点,执行这些语句后准备开始接收数据块长度
byOutput(1) = &H0
MSComm1.Output = byOutput '发送&H00表示请求数据长度
ElseIf iProgramNum = 2 Then 'Case
'接收数据长度并赋给iDataLength,然后发送&H01表示请求发送数据并将iProgramNum改为3
MSComm1.Settings = "57600,n,8,1"
byInput = MSComm1.Input '再发01表示准备接收数据,然后转到iProgramNum=03
For iTemp = LBound(byInput) To UBound(byInput)
byTemp = byInput(iTemp)
iDataLength = byInput(iTemp)
Next iTemp '可试一下上一句是否可以改为byTemp=byInput(iTemp)
txtShow.Text = txtShow.Text & "数据长:" & iDataLength & Space(1)
iProgramNum = 3
byOutput(1) = &H1
MSComm1.Output = byOutput '发送&H01表示准备接收数据
ElseIf iProgramNum = 3 Then 'Case
'读入数据及校验位,校验并显示,然后发送&H02改变Settings使程序可以进入下一个数据传送过程
If MSComm1.InBufferCount >= 23 Then
iPos = 1
MSComm1.Settings = "57600,n,8,1"
byInput = MSComm1.Input '这句容易forget,此时程序常常会提示"下标越界"
For iTemp = LBound(byInput) To UBound(byInput) 'byArray(iDataLength+1)放的为校验码
byArray(iPos) = byInput(iTemp)
iPos = iPos + 1
txtShow.Text = txtShow.Text & Chr(byInput(iTemp))
Next iTemp
byOutput(1) = &H2
MSComm1.Output = byOutput
'做校验
byTemp = 0
For iTemp = 1 To iDataLength
byTemp = (Val(byTemp) + byArray(iTemp)) And &HFF
Next iTemp
If byTemp = byArray(iDataLength + 1) Then
txtShow.Text = txtShow.Text & "校验位正确" & Space(1) & byTemp
End If
Else:
'varTemp = MsgBox("输入数据未完整,等待...", vbInformation, "system info") 'test
End If
'iTemp = MsgBox("End of iProgramNum=3", vbInformation, "程序测试提示") 'for test only
Else: iTemp = MsgBox("iProgramNum=" & iProgramNum & "未定义", vbInformation, "程序测试提示")
End If 'Case
End Select
End Sub
单片机的片选,可以说得更详细一些么?非常感谢。