热门标签 | 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;帧头和帧尾的重要性凸显。


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文介绍了如何在 macOS 上安装 HL-340 USB 转串口驱动,并提供了详细的步骤和注意事项。包括下载驱动、关闭系统完整性保护、安装驱动以及验证安装的方法。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • C# 中 SQLite 报错:在 "\\s\\" 附近出现语法错误,如何解决? ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
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社区 版权所有