MSComm控件串口通信开发

1. MSComm控件的处理流程

  MSComm在适当时候引发控件的处理流程主要分为两步:

1)通过事件驱动处理连接端口通信
  在收发一个字符或者生一个事件时,不管是产生一个事件还是错误(这取决于CommEvent的属性值),都会执行控件的事件程序OnComm()。我们需要预先将处理事件或者错误的逻辑代码输入在控件事件区。

2)检查CommEvent的属性值
  通过检查CommEvent的值来判断是事件还是错误,并根据触发事件时CommEvent不同的值编写不同的分支来处理对应事件。对于处理串口收发数据,最常用的事件属性值有comEvSend(发送数据)comEvReceive(接收数据)

2.上位机和下位机之间连接

  在早期,上位机和下位机之间经常使用的通信方式是RS-232的串行通信控制。直到今天,在USB通信普遍使用的方式下,PC端的应用软件依然是应用RS-232通信,保护了原有的软件开发投入。本次实验用的接口是较为常见USB接口,板子上采用了USB转串口芯片进行信号的转换。


局部功能

1.检查当前可用的串口

  上篇文章中讲到,VB6.0中MSComm控件的端口号仅限于1~16,并且大多数情况下用于插拔的USB都不是一个固定值,因此,我们首先需要获取PC机当前状态下可用于连接的串口端口号。

  代码如下:

On Error Resume Next '打开端口出错时,程序不会中断Dim I As Integer For I = 1 To 16 Step 1 '依次打开1~16的端口MSComm1.CommPort = IMSComm1.PortOpen = TrueIf Err.Number <> comPortInvalid ThenCombo1.AddItem "COM" & I  '获取能够正确打开的端口号End IfMSComm1.PortOpen = FalseNextCombo1.Text = Combo1.List(0)  '将可用串口展示在在下拉菜单中

  效果如下图:

相关代码

(1)On Error Resume Next
  加上这句语句后,若当程序运行到某处出错时,不会中断,而是会存储出错信息到某处,然后继续执行后面的代码。在这里使用它的原因是,如果当时上位机并没有相应的串口设备注册,那么当我们企图打开一个串口时,会因错误中断而导致程序无法进行下去。加上这句话后,再结合MSComm1.PortOpen属性判断串口是否正确打开,以便于进行接下来的不同操作。

(2)Err.Number <> comPortInvalid
  这句代码配合前面的On Error Resume Next使用。当发现打开串口出错时,继续执行后续代码,但这时已经将错误码存储于Err.Number之中,检查其是否和comPortInvalid相等,可判断该端口是否可用于串行通信。是,则将其加入下拉列表中。

2.串口打开按钮

  在找到对应的可打开串口后,选择其中一个串口打开,这时候,也需要检查串口是否能够正确打开,如果出错,则对用户进行提示。针对打开按钮的单击操作如下:

On Error Resume Next  ’打开出错时不中断If MSComm1.PortOpen = False ThenMSComm1.CommPort = Right(Combo1.Text, Len(Combo1.Text) - 3) MSComm1.PortOpen = TrueIf Err.Number = comPortInvalid ThenMsgBox "无法打开串口,请检查串口是否有效", vbOKOnly, "串口打开错误"ElseCommand1.Caption = "关闭"End IFElseMSComm1.PortOpen = FalseCommand1.Caption = "打开"End If

  在上述代码中,如果不能 正确打开串口,会弹出消息框(MsgBox)报错,如下图:

3.串口通信的设置

  在使用串口通信前,或者说打开串口前,应该对串口通信参数进行基础配置。这些配置参数可以在添加控件时的属性栏中进行编辑,也可以独自在代码中列出,如下:

 MSComm1.Settings = "9600,o,8,2"    '设置串口通信波特率MSComm1.InBufferSize = 1024  '接收缓冲区大小MSComm1.OutBufferSize = 512   '发送缓冲区大小MSComm1.InputLen = 32     '每次从接收缓冲区中取出的字节数MSComm1.InputMode = comInputModeBinary  '设置为字节流传送MSComm1.RThreshold = 9     '接收阈值,当接收字节数>=9时,触发接收事件MSComm1.RTSEnable = True       '接收功能使能MSComm1.SThreshold = 0         '设置为0,不会触发comEvSend事件

4.接收数据帧展示(十六进制)

  我们可以采用一个Text文本框进行接收数据的显示,将二进制字节数据转化为十六进制数据并以空格分隔显示在文本框当中。
1)对于文本框的设置
  对于文本框,我们希望其可以将每一帧数据进行滚动显示,并且每次都显示最后一帧数据,于是进行如下设置:

Text28.MultiLine = True        '允许多行显示
Text28.ScrollBars = 2         '垂直滚动显示
Text28.SelStart = Len(Text28.Text) '光标移到最后,每次显示最后一行

2)进制转换代码

Public Function ReceiveToHex(bytInput() As Byte) As StringDim I As IntegerDim strData As StringFor I = 0 To UBound(bytInput)   '遍历接收数组If Len(Hex(bytInput(I))) = 1 Then '无效0填充strData = strData & "0" & Hex(bytInput(I)) & " " ElsestrData = strData & Hex(bytInput(I)) & " " End IfNextReceiveToHex = strData & vbCrLf '末尾插入换行符
End Function

  效果图如图所示:

5.发送数据设置

  数据的发送使用了一个50ms的定时器,对发送数组进行内容填充更新,然后将该数组的值送入发送缓冲区。在定时器执行过程中有如下代码:

 PackTranData            '自定义数据填充更新函数MSComm1.Output = bytOutput '将更新后的数组送入发送缓冲区

  **注:**由于数据发送缓冲区的数据填充过程并不是每次都从头开始存放数据,而是采用游标移动添加数据,所以每次数据帧在传送字节流的具体位置并不固定,比如:这次发送的数据是:

00 00 5A A5 06 00 00 00 00 00 00 00 00 00 00 00 00 00 

下一次的数据很可能是:

00 00 00 00 00 00 00 00 00 00 5A A5 06 00 00 00 00 00 

所以这时候,在下位机的接收端找到对应的数据帧十分重要,帧头和帧尾的重要性凸显。

Win10下VB6.0开发之串口通信基础(二)代码功能篇相关推荐

  1. Win10下VB6.0开发之串口通信基础(一)控件属性篇

    前言:VB串口通信的方法一般有两种:一是通过Windows的通信API进行通信:另一种是通过VB的标准控件MSComm来实现.这篇文章要讲的是上位机如何通过VB的串口控件MSComm和下位机进行串口通 ...

  2. Win10下VB6.0开发之错误--无法打开对象窗口和代码窗口

    错误:Win10下使用VB6.0打开一个.vbp文件时,打不开对象窗口和代码窗口 解决办法:找了很久之后才发现,笔者所用笔记本外接了扩展显示屏,在断开外接显示屏连接后,打开VB,再重新外接显示屏即可. ...

  3. Win10下VB6.0开发之VB6.0的安装

    日前在做一个工控软件的开发项目,由于软件最终的运行环境是在Windows XP的下,考虑到兼容性问题,选择了visual basis 6.0.第一次上手VB6.0的开发,遇到了很多问题,在这里开个系列 ...

  4. Windows10下VB6.0开发——常见控件使用整理

    前言:以下整理了一些常见控件的使用,关于串口通信的控件的使用,在之前文章介绍过. 1. 单选按钮 -- OptionButton   有很多场景中会需要用到单选按钮,使用单选按钮的基本原则是:在同一个 ...

  5. Windows下VB6.0开发——VB程序断点调试与顺序执行不一致问题(通信原因)

    前言:这几天手上写的一段VB程序出现了断点调试与顺序执行结果不一致的情况,找问题找了很久,最后发现其实也是个能够注意的小问题,特此记录. 1. 程序架构   本次的实验结构如下,PC端的VB通过串口和 ...

  6. Windows10下VB6.0开发——常用数值处理函数工具

    前言:下面记录整理了VB中经常使用用于数据转换的工具函数. 数值处理 1. 取不大于n的最大整数--Int a = Int(-5.6) '=-6 a = Int(4.88) '=4 2. 四舍五入取整 ...

  7. Windows10下VB6.0开发——常用的字符串处理函数工具

    前言:下面记录整理了VB中经常使用用于字符串转换的工具函数. 字符串处理 1. 获取字符串长度--Len   Len函数中的一个参数是目标字符串,返回目标字符串的长度,例如num = Len(&quo ...

  8. Windows10下VB6.0开发——ini文件存储参数信息

    前言:在使用VB编写上位机程序时,想要实现一个功能--每次修改Text文本框中的值后,使得关闭程序后该数值能够保存,在下次打开时可以直接使用.本文介绍了INI文件对该功能的支持. 1.INI文件    ...

  9. Windows10下VB6.0开发——写入数据到文件操作

    前言:我们在编程中会经常需要将采集到的数据或者设置的参数保存到文件,在此进行VB的文件操作记录. VB保存参数到文件   VB中保存数据到文件的一种操作如下: Dim nHandle As Integ ...

最新文章

  1. Maven提高篇系列之(三)——使用自己的Repository(Nexus)
  2. LeetCode解题的常见模式套路
  3. 状压动规_(POJ2817)
  4. 最近幻影的两个ARP欺骗工具 挺不错的
  5. 存储ic载板_延伸IC领域 崇达技术拟将持有普诺威55%股权
  6. 台式电脑键盘字母乱了_电脑键盘的详细介绍,想懂点电脑必看
  7. 检测php源码函数版本,PHP通用检测函数集合
  8. php 给数组里面压入数组,php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)...
  9. 软件测试---正交试验法
  10. error “Device supports x86, but APK only supports armeabi-v7a”
  11. ASP.NET MVC 4 中Jquery上传插件Uploadify简单使用-版本:3.2.1
  12. AES-128\192\256加密算法及其安全脆弱分析
  13. 【网络文摘】程序人生:我们工作到底为了什么
  14. 详解CAN 2.0协议
  15. 自定义微信小程序TabBar
  16. R语言 使用getGEO()直接进行差异表达分析并显示Entrez_id和Symbol_id
  17. 怎样在word中打印框选对√
  18. 2021-SZTU第一届acm校赛总结
  19. google手机连接WIFI后总会提示“无法连接互联网“的解决方法
  20. 小程序webview嵌入h5兼容iphone安全区域

热门文章

  1. Android APK系列5-------修改APK中的内容
  2. springboot之mybatis分页查询
  3. 图像处理自学(六):图像增强算法总结
  4. 云服务器常用端口及其含义
  5. windows cmd命令行findstr 类似linux中的grep
  6. python锁机制_Python并发编程之谈谈线程中的“锁机制”(三)
  7. xugu clob字段如何导出_如何优雅的导出EXCEL
  8. c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?
  9. 电脑装oracle服务很卡,oracle11g安装后电脑启动很慢怎么解决
  10. linux(centos)系统安装activemq