【Modbus通信实验二】VC++编写串口调试助手

news2024/12/24 21:27:41

编写串口调试助手并能在虚拟机中实现虚拟端口通信。步骤如下:

  1. 项目中引入Microsoft Communications Control组件,并编写串口初始化函数。
    在这里插入图片描述
void CMODBUSDlg::initcomm()
{
	//串口状态,避免重复打开串口
	CommOpenFlag = FALSE;
	//设置串口端口号:需要在设备管理器中查看!
	m_mscomm_motor.SetCommPort(3);
	//设置接收模式为中断模式
	m_mscomm_motor.SetInputMode(1);
	//设置串口接收发送缓冲区大小
	m_mscomm_motor.SetInBufferSize(1024);
	m_mscomm_motor.SetOutBufferSize(1024);
	//设置串口波特率,位,校验方式
	m_mscomm_motor.SetSettings("9600, n, 8, 1");
}

m_mscomm_motor为设置的变量名,SetCommPort()传入的变量为端口号需要参考设备管理器中的可用虚拟端口号(COM3或COM5)。
在这里插入图片描述

  1. 添加按钮“打开串口”的并编写相应代码。
void CMODBUSDlg::OnButOpenComm() 
{
	if (!m_mscomm_motor.GetPortOpen()) //如果串口没有被打开
	{
		//打开串口
		m_mscomm_motor.SetPortOpen(TRUE);
		//设置中断阈值
		m_mscomm_motor.SetRThreshold(1);  //
		m_mscomm_motor.SetInputLen(0);
		m_mscomm_motor.GetInput();
		CommOpenFlag = true;
		AfxMessageBox("打开串口成功");
	}
	else   //如果串口已经被占用则输出FALSE
	{
		CommOpenFlag = false;
		AfxMessageBox("打开串口失败,检查串口是否被占用");
	}
}
  1. 添加按钮“发送数据”并编写相应代码。发送的数据后要添加2个字节的CRC校验码。
void CMODBUSDlg::OnButCommSend() 
{
	CByteArray sendArray;
	unsigned char SendBuf[6] = {0x33, 0x44, 0x55, 0x66, 0x00, 0x00};   //前4个字节为报文,后两个字节为CRC16校验码
	unsigned short sendNum  = 6;
	unsigned short countFor = 0;   
	unsigned short CrcResult;
	CrcResult = Modbus.CRC16(SendBuf, 4);
	SendBuf[4] = HIBYTE_NORMAL(CrcResult);
	SendBuf[5] = LOBYTE_NORMAL(CrcResult);
	//对数据进行转换
	sendArray.SetSize(sendNum);
	for (countFor=0; countFor<sendNum; countFor++)
	{
		sendArray.SetAt(countFor, SendBuf[countFor]);
	}
	//将转换完的数据通过串口发送出去
	m_mscomm_motor.SetOutput((COleVariant(sendArray)));
}
  1. 添加文本显示框并实现串口数据接收。
void CMODBUSDlg::OnOnCommMscomm1() 
{
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	unsigned char receDataTemp[1024];   //BYTE接收缓冲区
	int receDataLen = 0;  //接收数据长度
	long CountFor = 0;    //用于for循环
	if(m_mscomm_motor.GetCommEvent() == 2)           //事件值为2表示接收缓冲区内有字符
	{
		variant_inp   = m_mscomm_motor.GetInput();         //读缓冲区
		safearray_inp = variant_inp;                       //VARIANT型变量转换为ColeSafeArray型变量
		receDataLen   = safearray_inp.GetOneDimSize();     //得到有效数据长度
		for(CountFor=0; CountFor<receDataLen; CountFor++)
		{
			safearray_inp.GetElement(&CountFor,receDataTemp+CountFor);   //转换为BYTE型数组
		}
		//将接收的数据转化为显示的字符串
		CString str, strTemp;
		for (int i=0; i<receDataLen; i++)
		{
			strTemp.Format("%02x ", receDataTemp[i]);
			str += strTemp;
		}
		//为回车、换行
		str +="\r\n";
		//将要显示的变量关联到前台显示界面
		m_display += str;
		//UpdataData(FALSE)为将变量更新到显示界面,UpdataData(TRUE)为将显示界面输入值更新到变量
		UpdateData(FALSE);
	}
}

以下为代码中所使用到的一些特殊数据类型和方法的简单解释:

COleSafeArray

COleSafeArray是一个从OLE VARIANT结构派生而来的类,用于处理任意类型和维数的数组。它可以通过Win32 API包装和一维数组操作来创建、访问和修改安全数组。VARIANT是一个结构体,可以封装不同的数据类型。要使用COleSafeArray,需要包含<afxdisp.h>头文件。

COleSafeArray的GetELement方法

COleSafeArray的GetElement方法是用于获取安全数组中的一个单一元素。它需要一个索引地址(必须是long型)和一个指向接收数据的存储区域的指针作为参数。例如,如果要获取一个一维的COleSafeArray对象中的第三个元素,可以这样写:

COleSafeArray sa;
// 创建和初始化sa
long index = 2; // 索引从0开始,必须是long
VARIANT var;
sa.GetElement(&index, &var); // 获取第三个元素
// 处理var

为什么COleSafeArray的GetElement方法没有返回值

COleSafeArray的GetElement方法没有返回值,是因为它将获取的元素放在第二个参数指向的存储区域中。这样做的好处是,可以避免返回值的类型不匹配或内存泄漏的问题。如果你想要一个返回值,你可以使用COleVariant类来封装COleSafeArray对象,然后使用operator[]来访问元素,例如:

COleSafeArray sa;
// 创建和初始化sa
COleVariant var(sa); // 封装sa
VARIANT elem = var[2]; // 获取第三个元素
// 处理elem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven构建工具下载与配置(图文详细)

一.下载安装 1.找到官网 2.进行下载 3.解压文件到想要的目录 二.系统配置 配置本地仓库localRepository 1.配置本地仓库位置xml 为了方便管理&#xff0c;在apache-maven-3.9.4目录下创建mvn_rep 2.找到ocalRepository标签 3.设置本地仓库路径 配置私服&#xff08;由于正常…

2023年7月京东空调行业品牌销售排行榜(京东数据运营)

上半年空调市场的热度较高&#xff0c;尽管受家电市场整体环境的影响&#xff0c;同比来看空调销量销额有一定幅度的下滑&#xff0c;但从环比来看&#xff0c;空调市场的销量销额纷纷翻倍增长。不过&#xff0c;进入7月份&#xff0c;空调市场整体就比较低迷了。 根据鲸参谋平…

matlab中exp和expm的区别

exp()为数组 X 中的每个元素返回指数 e x e^{x} ex expm()计算 X 的矩阵指数。 两个函数传入矩阵后计算的结果是不同的&#xff0c;千万不能混淆。之前曾经想当然得把exp里传入矩阵当矩阵指数使用&#xff0c;也未验证正确性&#xff0c;实不应该。

Viobot开机指南

0.前言 本篇旨在让每个拿到Viobot设备的用户都能够第一时间测试它的效果&#xff0c;以及将设备配置到自己的环境下面。 1.上电 首先&#xff0c;我们先要把设备接上电源线和网线&#xff0c;最简单的方式就是网线直连电脑。 电源选用12V1.5A设备自带的电源即可。 2.配置网…

免费的苹果笔记本清理内存软件CleanMyMac X

苹果笔记本如何清理内存&#xff1f;CleanMyMac X给你支招。随着时间的推移&#xff0c;苹果笔记本的内存可能会变得拥挤&#xff0c;导致性能下降。不过&#xff0c;你不必担心&#xff0c;因为我们有一种解决方案&#xff0c;能够帮助你优化你的苹果笔记本的内存使用效率。Cl…

小型气象站——智能监测、多要素集成

小型气象站是一种简易的气象监测设备&#xff0c;具有智能监测、多要素集成、便于安装携带的特点&#xff0c;能够让人们随时随地获取当地的气象信息&#xff0c;接下来&#xff0c;就让我们介绍一下它的基本信息吧。 1.小型气象站的概念 小型气象站可以同时测量风速、风向、…

「Python|aiohttp|并发与协程」将HTTP请求提速成百上千倍!一次性掌握把requests请求改成协程的通用方法

本文主要介绍如何通过使用aiohttp库将同步的http请求改成异步方式请求&#xff0c;从而降低等待网络IO过程中时间和计算资源的浪费。 主要包括如何将常见的requests请求改用aiohttp异步执行以及如何将异步的批量请求方法封装成普通方法/同步调用方式&#xff0c;给业务模块调用…

Docker容器进入的4种方式(推荐最后一种)

Docker容器进入的4种方式【推荐最后一种】 在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 一、使用docker attach进入Docker容器二、…

问题解决 | 关于torch中遇到的错误及解决

本博客主要解决在torch使用中遇到的问题与解决~ 1.安装相关问题 1.1.conda虚拟环境内无法安装torch&#xff08;pip install torch &#xff09; 解决方案&#xff1a; 如果是GPU版本&#xff0c;先查看cuda版本如果nvcc -V 命令运行后出来的是cuda11.3的话&#xff0c;其他…

修改 el-select 背景图 样式

1. 原图------------效果图 2. css /***********大的背景图***************/ .el-popper.is-pure {background: url(/src/assets/imgList/memuBG.png) no-repeat;border: none;background-size: 100% 100%; }/*********选中行的字体***********/ .el-select-dropdown__item.s…

【数据库系统】--【3】DBMS数据组织

DBMS数据组织 01关系表的数据组织02索引的数据组织03元数据的数据组织04数据组织的优化 01关系表的数据组织 02索引的数据组织 03元数据的数据组织 04数据组织的优化 小结. ●关系表的数据组织 ●索引的数据组织 B树索引HASH索引Bitmap索引 ●元数据的数据组织 ●数据组织的优…

一文了解汽车芯片的分类及用途介绍

汽车芯片按其功能可分为控制类&#xff08;MCU和AI芯片&#xff09;、功率类、传感器和其他&#xff08;如存储器&#xff09;四种类型。市场基本被国际巨头所垄断。人们常说的汽车芯片是指汽车里的计算芯片&#xff0c;按集成规模可分为MCU芯片和AI芯片&#xff08;SoC芯片&am…

Camunda 7.x 系列【18】服务任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 代码委托2.1 Java 委托3. 流程建模3.1 基础3.2 实现3.3 结束4. 测试1. 概述 用户…

vue3+vite+ts引入海康威视监控

1.首先我们在海康威视官网上面下载这个 下载以后打开demo 把这三个文件放进你的public里面去 在vue3项目里的index.html引入 <!--三个必要的js文件引入--><script src"./public/hikvision/jquery-1.12.4.min.js"></script><script src".…

Python学习笔记_基础篇(十一)_socket编程

python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心&#xff0c;它承担计算机的所有任务。 操作系统是运行在硬件之上的软件&#xff0c;是计算机的管理者&#xff0c;它负责资源的管理和分配、任务的调度。 程序是运行…

基于 spring boot 的动漫信息管理系统【源码在文末】

半山腰总是最挤的&#xff0c;你得去山顶看看 大学生嘛&#xff0c;论文写不出&#xff0c;代码搞不懂不要紧&#xff0c;重要的是&#xff0c;从这一刻就开始学习&#xff0c;立刻马上&#xff01; 今天带来的是最新的选题&#xff0c;基于 spring boot 框架的动漫信息管理系…

Mysql_5.7下载安装与配置基础操作教程

目录 一、Mysql57下载与安装 二、尝试登录Mysql 三、配置Mysql环境变量 一、Mysql57下载与安装 首先&#xff0c;进入Mysql下载官网&#xff1a;MySQL Community Downloads 随后&#xff0c;选择版本5.7.43&#xff0c;系统选择Windows&#xff0c;随后下方会出现两个下载选…

81-基于stm32单片机DHT11温湿度MQ4可燃气体天然气浓度检测系统自动散热加湿排气Proteus仿真+源码...

资料编号&#xff1a;081 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏MQ4可燃气体浓度检测DHT11温湿度电机按键&#xff0c;制作一个温湿度采集、MQ4可燃气体浓度采集&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、湿度下限、可燃…

浅谈OCR中的David Shepard

在OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;中&#xff0c;David Shepard是一种早期的OCR技术&#xff0c;也被称为Shepards Method。 David Shepard是该OCR方法的原始作者。这种方法基于边界追踪算法&#xff0c;用于识别印刷体文本…

mkv视频格式怎么转换为mp4?

mkv视频格式怎么转换为mp4&#xff1f;实际上&#xff0c;我们将MKV格式的文件转换成 MP4格式之后&#xff0c;能够在很大程度上提高原文件的利用率&#xff0c;也保证了文件的兼容性。很多时候&#xff0c;由于格式限制问题&#xff0c;文件在某些设备和软件上无法正常播放。所…