vb6串口通信可以很简单,工具箱 部件里 添加 microsoft comm control 6.0,然后把这个不占位控件放到界面,他的事件就是可以处理接收数据,另外按钮触发发送,这样就能完整收发了
注意 MSComm1.RThreshold = 1才能有数据就触发接收事件
Private Sub cmdSend_Click()
'发送文字数据
MSComm1.OutBufferCount = 0 '...清空输出寄存器
'MSComm1.Output = Text1.Text '...发送文字数据
Dim v(12) As Byte
v(0) = &H0
v(1) = &H0
v(2) = &HFF
v(3) = &H0
v(4) = &H4
v(5) = &H0
v(6) = &H4
v(7) = &HFF
v(8) = &H0
v(9) = &H4
v(10) = &HFF
v(11) = &H2
v(12) = &H0
MSComm1.Output = v '发送2进制数据 00 00 FF 00 04 00 04 FF 00 03 FF 01 00
End Sub
Private Sub cmdStart_Click()
'注意vb里字符串下标从1开始,com口最多16个,所以长度参数用2
MSComm1.CommPort = Mid(Combo1.Text, 4, 2)
'MSComm1.CommPort =1
'MSComm1.Settings = "9600,n,8,1"
MSComm1.Settings = "115200,n,8,1"
MSComm1.RThreshold = 1 '接收缓冲区有数据及时触发事件
'MSComm1.InputMode = comInputModeText
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 512
MSComm1.SThreshold = 0
MSComm1.RThreshold = 1
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
cmdSend.Enabled = True
cmdStart.Enabled = False
End Sub
字符串传输太简单,注释掉后传输2进制数据
最后能够发送2进制指令,得到jc5000设备返回主控程序版本号
注意,设备返回数据可能分包,所以不在mscom控件的事件里立即读数据,而是用定时器过一会儿再读,这样每次就能读到一个完整包
Dim Rv_data() As Byte
Private Sub MSComm1_OnComm()
'00 00 FF 00 FF 00 00 00 FF 00 22 00 22 FF 00 03 FF 00 20 22 09 13 01 20 21 05 30 01 20 22 09 13 02 20 21 08 26 01 00 32 30 32 31 31 31 31 37 36 00
'If MSComm1.InBufferCount Then
'Text1.Text = MSComm1.Input '...接受显示数据
'MSComm1.InBufferCount = 0 '...清空输入寄存器
'End If
' Sleep (200) '相隔200ms就可以完整接收到分包数据
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Timer1.Enabled = False
Dim UB1, UB2, TM As Integer, i As Integer
Dim strData As String
Select Case MSComm1.CommEvent
Case comEvReceive
If MSComm1.InBufferCount > 0 Then
Rv_data = MSComm1.Input
MSComm1.InBufferCount = 0
End If
For i = 0 To UBound(Rv_data)
If Len(Hex(Rv_data(i))) = 1 Then
strData = strData & "0" & Hex(Rv_data(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格
Else '方便显示观察如: 00 0F FE
strData = strData & Hex(Rv_data(i)) & " "
End If
Next
Text1.Text = strData
End Select
End Sub
vb6的程序想启用xp以上操作系统风格,最好在代码里加几行控件初始化,
这样exe同目录放一个manifest文件就能生效
Private Declare Sub InitCommonControls Lib "comctl32" ()
Private Sub Form_Initialize()
InitCommonControls '[注入XP样式功能;编译后在xp样式的操作系统上可看到效果]
End Sub
本机运行没问题,发布到另一台机器试试,发现有报错,后来想起来是别的机器可能没有串口,所以 用串口前应该增加检查
Private Sub checkport(i As Integer)
On Error GoTo errline '如果出错,进入错误处理程序
MSComm1.CommPort = i '依次打开每个串口
MSComm1.PortOpen = True '打开串口
If MSComm1.PortOpen = True Then '如果打开成功,说明该串口可用
MSComm1.PortOpen = False '检查完毕,关闭串口
Combo1.AddItem "COM" + CStr(i) '将可用串口增加到组合框
End If
errline:
If Err.Number = 8005 Then '若有的串口已被其他程序打开,也应该将其加入组合框内
Combo1.AddItem "COM" + CStr(i) '将可用串口增加到组合框内
End If
End Sub
Private Sub Form_Load()
Combo1.Clear
Dim i As Integer '定义可访问的串口总数
i = 5
checkport (i)
If Combo1.ListCount > 0 Then
Combo1.ListIndex = 0 '将第一个可用串口设为默认值
Text1.Text = Mid(Combo1.Text, 4, 2)
Else
Text1.Text = "没有串口 com5 ,请查看硬件连接是否存在串口"
End If
End Sub
Private Sub Command2_Click()
Combo1.Clear
Dim i As Integer '定义可访问的串口总数
Dim Counter As Integer '用于记录经检查可以使用的串口号
Counter = 0 '计数器清零
For i = 1 To 16 '循环检查可能存在的16个串口
checkport (i)
Next i
If Combo1.ListCount > 0 Then
Combo1.ListIndex = 0 '将第一个可用串口设为默认值
Else
Text1.Text = "没有串口"
End If
End Sub