热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

MSComm控件串口通信开发1.MSComm控件的处理流程MSComm在适当时候引发控件的处理流程主要分为两步:1)通过事件驱动处理连接端口通信  

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 &#39;打开端口出错时&#xff0c;程序不会中断Dim I As Integer For I &#61; 1 To 16 Step 1 &#39;依次打开1~16的端口MSComm1.CommPort &#61; IMSComm1.PortOpen &#61; TrueIf Err.Number <> comPortInvalid ThenCombo1.AddItem "COM" & I &#39;获取能够正确打开的端口号End IfMSComm1.PortOpen &#61; FalseNextCombo1.Text &#61; Combo1.List(0) &#39;将可用串口展示在在下拉菜单中

  效果如下图&#xff1a;
在这里插入图片描述
相关代码&#xff1a;

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

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


2.串口打开按钮

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

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

  在上述代码中&#xff0c;如果不能 正确打开串口&#xff0c;会弹出消息框(MsgBox)报错&#xff0c;如下图&#xff1a;
在这里插入图片描述


3.串口通信的设置

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

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

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

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

Text28.MultiLine &#61; True &#39;允许多行显示
Text28.ScrollBars &#61; 2 &#39;垂直滚动显示
Text28.SelStart &#61; Len(Text28.Text) &#39;光标移到最后&#xff0c;每次显示最后一行

2&#xff09;进制转换代码

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

  效果图如图所示&#xff1a;
在这里插入图片描述


5.发送数据设置

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

PackTranData &#39;自定义数据填充更新函数MSComm1.Output &#61; bytOutput &#39;将更新后的数组送入发送缓冲区

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

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

下一次的数据很可能是&#xff1a;

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

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


推荐阅读
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
author-avatar
紫逸石
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有