C++连接串口方式(MFC版本)(简单版本)
ComSerialPort.h
/*_________________________串口________________________________*/class Com_SerialPort
{
public:Com_SerialPort();Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits);~Com_SerialPort();
public:bool Connect(bool bMutex = false) override;void DisConnect(bool bMutex = false) override;bool clearBuf_c();bool recvBuf_c(char* pStr, int& len, int waitTimeMS = 0) override;bool sendBuf_c(char const *pStr, const int& len) override;
private:BOOL setReadTime(DWORD time);
private:HANDLE m_hCom;DCB m_dcb;COMMTIMEOUTS m_timeOuts;
};
ComSerialPort.cpp
/*_________________________串口________________________________*/Com_SerialPort::Com_SerialPort()
{m_dcb.BaudRate = 9600; //波特率为9600m_dcb.ByteSize = 8; //每个字节有8位m_dcb.Parity = NOPARITY; //无奇偶校验位m_dcb.StopBits = ONESTOPBIT; //1个停止位m_typeName = "串口";//设定读超时m_timeOuts.ReadIntervalTimeout = 100;//读间隔超时m_timeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数 m_timeOuts.ReadTotalTimeoutConstant = 1000;//读时间常量 //设定写超时m_timeOuts.WriteTotalTimeoutMultiplier = 500; // 写时间系数 m_timeOuts.WriteTotalTimeoutConstant = 2000;//写时间常量
}Com_SerialPort::Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits)
{m_Port = port;m_dcb.BaudRate = baudRate; //波特率为9600;m_dcb.ByteSize = byteSize; //每个字节有8位;m_dcb.Parity = parity; //无奇偶校验位;m_dcb.StopBits = stopBits; //1个停止位;m_typeName = "串口";//设定读超时m_timeOuts.ReadIntervalTimeout = 100;//读间隔超时m_timeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数 m_timeOuts.ReadTotalTimeoutConstant = 1000;//读时间常量 //设定写超时m_timeOuts.WriteTotalTimeoutMultiplier = 500; // 写时间系数 m_timeOuts.WriteTotalTimeoutConstant = 2000;//写时间常量
}Com_SerialPort::~Com_SerialPort()
{
}bool Com_SerialPort::Connect(bool bMutex)
{QMutexLocker locker(&m_Mutex);DisConnect(false);char str_c[256];memset(str_c, '\0', 256);snprintf(str_c, sizeof(str_c), "COM%d", m_Port);std::string ComStr(str_c);WCHAR wComName[128];memset(wComName, '\0', sizeof(wComName));MultiByteToWideChar(CP_ACP, 0, ComStr.c_str(), -1, wComName, sizeof(wComName) / sizeof(wComName[0]));m_hCom = CreateFile(wComName,//COM1口GENERIC_READ | GENERIC_WRITE, //允许读和写;0, //独占方式;NULL,OPEN_EXISTING, //打开而不是创建;0, //同步方式;NULL);//if (hCom1 == (HANDLE)-1)if (m_hCom == INVALID_HANDLE_VALUE){printf("打开COM失败!\n");m_bConnectOK = false;return false;}SetupComm(m_hCom, CHAR_LEN, CHAR_LEN); //输入缓冲区和输出缓冲区的大小都是1024//设定读超时BOOL RTN = SetCommTimeouts(m_hCom, &m_timeOuts); //设置超时DCB dcb;GetCommState(m_hCom, &dcb);dcb.BaudRate = m_dcb.BaudRate; //波特率为9600dcb.ByteSize = m_dcb.ByteSize; //每个字节有8位dcb.Parity = m_dcb.Parity; //无奇偶校验位dcb.StopBits = m_dcb.StopBits; //1个停止位SetCommState(m_hCom, &dcb);m_bConnectOK = true;return true;
}void Com_SerialPort::DisConnect(bool bMutex)
{if (bMutex)m_Mutex.lock();if (m_hCom != INVALID_HANDLE_VALUE){CloseHandle(m_hCom);m_hCom = INVALID_HANDLE_VALUE;m_bConnectOK = false;}if (bMutex)m_Mutex.unlock();
}bool Com_SerialPort::clearBuf_c()
{QMutexLocker locker(&m_Mutex);setReadTime(200);DWORD initTime = GetTickCount();do{DWORD readsize = 0;ReadFile(m_hCom, m_recvBuffer, CHAR_LEN, &readsize, NULL);if (readsize <= 0)return true;if (abs(int(GetTickCount() - initTime)) > 1000)return false;} while (1);return false;
}bool Com_SerialPort::recvBuf_c(char * pStr, int & len, int waitTimeMS)
{QMutexLocker locker(&m_Mutex);DWORD readsize = 0;setReadTime(waitTimeMS);ReadFile(m_hCom, pStr, CHAR_LEN, &readsize, NULL);len = readsize;return readsize>0;
}bool Com_SerialPort::sendBuf_c(char const * pStr, const int & len)
{QMutexLocker locker(&m_Mutex);BOOL rtn = WriteFile(m_hCom, pStr, len, NULL, NULL);return rtn != 0;
}BOOL Com_SerialPort::setReadTime(DWORD time)
{if (time != m_timeOuts.ReadTotalTimeoutConstant){//读时间常量m_timeOuts.ReadTotalTimeoutConstant = time;return SetCommTimeouts(m_hCom, &m_timeOuts); //设置超时}return 0;
}相关文章:
C++连接串口方式(MFC版本)(简单版本)
ComSerialPort.h /*_________________________串口________________________________*/class Com_SerialPort { public:Com_SerialPort();Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits);~Com_SerialPort(); public:bool Connect(bool bMut…...
ospf重发布
华子目录 一、实验拓扑二、实验要求三、实验思路1、配置接口IP地址以及环回地址(以此类推)2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&am…...
基于weka手工实现K-means
一、K-means聚类算法 K均值聚类(K-means clustering)是一种常见的无监督学习算法,用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。 K均值聚类的基本思想如下: …...
分布式系统监控zabbix安装部署及使用
分布式系统监控zabbix安装部署及使用 一.zabbix监控 1.什么是zabbix zabbix:是一款开源免费的,自动化发现服务与网络设备的分布式监控,可以监视应用层服务并以web前端页面集中管理并展示。 2.zabbix功能 监控服务器cpu负载、服务器内存使…...
【H5】使用 JavaScript 和 CSS 来完成实现鼠标接触时显示一个图片弹窗
以下是一个示例,演示了如何在鼠标接触时显示一个图片弹窗: HTML: <a href"#" class"popup-link" target"_blank"><i class"fab fa-weixin"></i> </a><div id"popup-containe…...
CSS选择器分类梳理并高亮重点
前言 主要内容来自菜鸟教程 CSS 选择器 | 菜鸟教程 分类是我自己理解的分类,示例说明优化统一了表述风格。 正文 选择器CSS示例示例说明基础*2*选择所有元素:root3:root选择文档的根元素element1p选择所有<p>元素:not(selector)3:not(p)选择所有并非p元素…...
Python批量给excel文件加密
有时候我们需要定期给公司外部发邮件,在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。 python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…...
程序设计 树基础
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
Java 并发编程与CAS基本原理
一、Java并发基础知识 Java里的程序天生就是多线程的,那么有几种新启线程的方式? 两种,启动线程的方式只有: 1、X extends Thread;,然后X.start; 2、X implements Runnable;然后交给Thread运行。 Java…...
qt creater运行按钮灰色,问题记录
第一次安装还没运行就出了三个错误: 1.F:\wei\Qt\Tools\CMake_64\share\cmake-3.24\Modules\CMakeTestCXXCompiler.cmake:62: error: The C compiler "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/cl.exe" is not able to compil…...
【jvm】类加载器的分类
目录 一、说明二、示例2.1 代码2.2 截图 三、启动类加载器四、扩展类加载器五、应用程序类加载器 一、说明 1.jvm支持两种类型的类加载器,分别是引导类加载器(bootstrap classloader)和自定义类加载器(user-defined classloader&a…...
电路基础之电容
电容器(Capacitor)是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等,而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素: 电极:电容器的电极是两个导体…...
函数柯里化
文章目录 基本概念柯里化(Currying)是什么?通用的柯里化实现ES5 实现ES6 实现 基本概念 在讲柯里化之前我们先来了解一些基本概念: Function.length: length 属性指明函数的形参个数 function func1() {} function …...
【HBZ分享】ES中的Reindex重建索引
Reindex如何实现索引重建? 滚动索引 批量复制 Reindex存在的问题 如果新的索引没有提前创建好,并指定字段类型,那么重建后的新索引类型极有可能会和旧的索引不一致,因为ES他会推断类型,而推断错误率从实战来说那是…...
【PostgreSQL】几个提高性能的小特性
一、LOCALE 与 “operator class” 在PostgreSQL里,LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置,包括字母表、排序、数字格式等。 LOCALE里有一个比较重要的规则LC_COLLATE,即排序方式(Collation),它会对数据…...
[C语言] 指针
1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么? 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针…...
win10在vmware15中安装macos10.13系统
第一步、安装vmware版本信息如下 第二步、下载unlocker-main和darwin.iso放到安装文件夹 第三步、管理员身份运行win-install.cmd 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS 10.13并选择语言 第六步、选择磁盘工具抹掉磁盘 第七步、格式化完成后退出磁盘工…...
Node.js:实现遍历文件夹下所有文件
Node.js:实现遍历文件夹 代码如下 const fs require(fs) const path require(path)function traverseFolder(folderPath) {// 读取文件夹列表const files fs.readdirSync(folderPath)// 遍历文件夹列表files.forEach(function (fileName) {// 拼接当前文件路径…...
Git详解及使用
Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…...
Jmeter设置中文的两种方式,建议使用第二种
方案一 进入jmeter图像化界面,选择Options下的Choose Language,再选择Chinese(Simplified)。这个就是选择语言为简体中文(缺陷:这个只是在本次使用时为中文,下次打开默认还是英文的) 方案二(…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
