当前位置: 首页 > news >正文

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地址以及环回地址&#xff08;以此类推&#xff09;2、配置动态路由协议3、重发布4、更改接口类型5、配置路由策略 一、实验拓扑 二、实验要求 1、使用双点双向重发布2、所有路由器进行最佳选路3、存在备份路径&am…...

基于weka手工实现K-means

一、K-means聚类算法 K均值聚类&#xff08;K-means clustering&#xff09;是一种常见的无监督学习算法&#xff0c;用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。 K均值聚类的基本思想如下&#xff1a; …...

分布式系统监控zabbix安装部署及使用

分布式系统监控zabbix安装部署及使用 一.zabbix监控 1.什么是zabbix zabbix&#xff1a;是一款开源免费的&#xff0c;自动化发现服务与网络设备的分布式监控&#xff0c;可以监视应用层服务并以web前端页面集中管理并展示。 2.zabbix功能 监控服务器cpu负载、服务器内存使…...

【H5】使用 JavaScript 和 CSS 来完成实现鼠标接触时显示一个图片弹窗

以下是一个示例&#xff0c;演示了如何在鼠标接触时显示一个图片弹窗&#xff1a; HTML: <a href"#" class"popup-link" target"_blank"><i class"fab fa-weixin"></i> </a><div id"popup-containe…...

CSS选择器分类梳理并高亮重点

前言 主要内容来自菜鸟教程 CSS 选择器 | 菜鸟教程 分类是我自己理解的分类&#xff0c;示例说明优化统一了表述风格。 正文 选择器CSS示例示例说明基础*2*选择所有元素:root3:root选择文档的根元素element1p选择所有<p>元素:not(selector)3:not(p)选择所有并非p元素…...

Python批量给excel文件加密

有时候我们需要定期给公司外部发邮件&#xff0c;在自动化发邮件的时候需要对文件进行加密传输。本文和你一起来探索用python给单个文件和批量文件加密。    python自动化发邮件可参考【干货】用Python每天定时发送监控邮件。 文章目录 一、安装pypiwin32包二、定义给excel加…...

程序设计 树基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

Java 并发编程与CAS基本原理

一、Java并发基础知识 Java里的程序天生就是多线程的&#xff0c;那么有几种新启线程的方式&#xff1f; 两种,启动线程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start&#xff1b; 2、X implements Runnable&#xff1b;然后交给Thread运行。 Java…...

qt creater运行按钮灰色,问题记录

第一次安装还没运行就出了三个错误&#xff1a; 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支持两种类型的类加载器&#xff0c;分别是引导类加载器&#xff08;bootstrap classloader&#xff09;和自定义类加载器&#xff08;user-defined classloader&a…...

电路基础之电容

电容器&#xff08;Capacitor&#xff09;是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等&#xff0c;而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素&#xff1a; 电极&#xff1a;电容器的电极是两个导体…...

函数柯里化

文章目录 基本概念柯里化&#xff08;Currying&#xff09;是什么&#xff1f;通用的柯里化实现ES5 实现ES6 实现 基本概念 在讲柯里化之前我们先来了解一些基本概念&#xff1a; Function.length&#xff1a; length 属性指明函数的形参个数 function func1() {} function …...

【HBZ分享】ES中的Reindex重建索引

Reindex如何实现索引重建&#xff1f; 滚动索引 批量复制 Reindex存在的问题 如果新的索引没有提前创建好&#xff0c;并指定字段类型&#xff0c;那么重建后的新索引类型极有可能会和旧的索引不一致&#xff0c;因为ES他会推断类型&#xff0c;而推断错误率从实战来说那是…...

【PostgreSQL】几个提高性能的小特性

一、LOCALE 与 “operator class” 在PostgreSQL里&#xff0c;LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置&#xff0c;包括字母表、排序、数字格式等。 LOCALE里有一个比较重要的规则LC_COLLATE&#xff0c;即排序方式(Collation)&#xff0c;它会对数据…...

[C语言] 指针

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么&#xff1f; 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&#xff1a;实现遍历文件夹 代码如下 const fs require(fs) const path require(path)function traverseFolder(folderPath) {// 读取文件夹列表const files fs.readdirSync(folderPath)// 遍历文件夹列表files.forEach(function (fileName) {// 拼接当前文件路径…...

Git详解及使用

Git简介 Git 是一种分布式版本控制系统&#xff0c;它可以不受网络连接的限制&#xff0c;加上其它众多优点&#xff0c;目前已经成为程序开发人员做项目版本管理时的首选&#xff0c;非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…...

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...