一个好用的串口类(收发自如)
个串口通讯的类
/**/
#ifndef _CommUtils_H__
#define _CommUtils_H__class CommUtils
;#endif/**/
#include "stdafx.h"
#include "CommUtils.h"
#include "stdio.h"
const int READ_TIMEOUT = 500;CommUtils::CommUtils()CommUtils::~CommUtils()
{this->CloseCom();
}bool CommUtils::OpenCom(int Port)
{if (bOpenCom){this->CloseCom();bOpenCom = false;}char szport[10];sprintf(szport,"COM%d",Port);hComm = CreateFile( szport,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, //FILE_ATTRIBUTE_NORMAL|NULL);if (hComm == INVALID_HANDLE_VALUE) return false;if (!SetupComm(hComm, 1024, 512)) return false;COMMTIMEOUTS commtimeouts;commtimeouts.ReadIntervalTimeout = MAXDWORD;commtimeouts.ReadTotalTimeoutConstant =0;commtimeouts.ReadTotalTimeoutMultiplier =0;commtimeouts.WriteTotalTimeoutConstant =0;commtimeouts.WriteTotalTimeoutMultiplier=0;if (!SetCommTimeouts(hComm, &commtimeouts)) return false;memset(&ReadovReady,0,sizeof(OVERLAPPED));memset(&WriteovReady,0,sizeof(OVERLAPPED));ReadovReady.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);WriteovReady.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);SECURITY_ATTRIBUTES sa;sa.nLength=sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor=NULL;sa.bInheritHandle=TRUE;DCB dcb;GetCommState(hComm, &dcb);dcb.fBinary = TRUE;dcb.fParity = TRUE;dcb.BaudRate = CBR_9600; // 波特率 9600dcb.ByteSize = 8; // 8 位数据位dcb.Parity = NOPARITY; // 无奇偶校验dcb.StopBits = ONESTOPBIT; // 1 个停止位if (!SetCommState(hComm, &dcb )) return false;bOpenCom = true;return bOpenCom;
}bool CommUtils::WriteCom(unsigned char *sendchar, int sendsize)
{if (!bOpenCom) return false;DWORD BytesSent;DWORD resD; PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);BytesSent=0;BOOL hr = WriteFile(hComm, // Handle to COMM Portsendchar, // Pointer to message buffer in calling finctionsendsize, // Length of message to send&BytesSent, // Where to store the number of bytes sent&WriteovReady); // Overlapped structureif(!hr){if(GetLastError() != ERROR_IO_PENDING){return false;}else{resD=WaitForSingleObject(WriteovReady.hEvent,INFINITE);}switch(resD){case WAIT_OBJECT_0:{if(!GetOverlappedResult(hComm,&WriteovReady,&BytesSent,false))return false;elsereturn true;}default:return false;break;}}return true;
}void CommUtils::CloseCom()
{if (!bOpenCom) return;CloseHandle(hComm);hComm=NULL;CloseHandle(ReadovReady.hEvent);CloseHandle(WriteovReady.hEvent );ReadovReady.hEvent =NULL;WriteovReady.hEvent =NULL;
}bool CommUtils::ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength)
{if (!bOpenCom) return false;if (ReadovReady.hEvent == NULL) return false;ReceiveLength = 0;if (ReadFile(hComm, ReceiveData, 128, &ReceiveLength, &ReadovReady) == FALSE) {if (GetLastError() != ERROR_IO_PENDING) return false;}if(ReceiveLength == 0) return false;ReceiveData[ReceiveLength] = 0;DWORD dwRead;DWORD dwRes = WaitForSingleObject(ReadovReady.hEvent, READ_TIMEOUT);switch(dwRes){case WAIT_OBJECT_0:if (!GetOverlappedResult(hComm, &ReadovReady, &dwRead, FALSE)) return false;break;case WAIT_TIMEOUT:break; default:break;}return true;
}以下为使用方法:
// 1. 包含头文件,定义变量
#include "CommUtils.h"
CommUtils theComm;
unsigned char data[1024];
unsigned long len = 0;// 2. 打开串口,设置接收定时器
theComm.OpenCom(1); // 打开COM1口
SetTimer(1, 50, 0);// 3. 发送数据
theComm.WriteCom(data, len);// 4. 接收数据处理
void CUARTDlg::OnTimer(UINT nIDEvent)
{if (nIDEvent == 1){if (theComm.ReadCom(data, len)){if (len > 0) {// 接收数据处理。。。}}}CDialog::OnTimer(nIDEvent);
}
一个好用的串口类(收发自如)相关推荐
- 一个由印度人编写的VC串口类
软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口.写串口等. 这个类有点特别,它没有 ...
- 一个印度人写的VC串口类CSerialCom(有串口基础介绍)
http://www.vc-rs232.com/html/VC_SSCOM_Control/2011/0117/34.html 一个印度人写的VC串口类CSerialCom(有串口基础介绍) 软件介绍 ...
- hal库串口dma卡死_HAL库版DMA循环模式串口数据收发
在<STM32CubeMX初识与工程创建>的基础上,首先对串口进行设置,以实现通过串口对数据的收发.STM32CubeMX生成的HAL库中,提供了三类串口数据收发的接口,分别为阻塞模式,非 ...
- 一个严谨的STM32串口DMA发送接收(1.5Mbps波特率)机制
文章目录 1 前言 2 串口有必要使用DMA吗 3 实现方式 4 STM32串口使用DMA 5 串口DMA接收 5.1 基本流程 5.2 相关配置 5.3 接收处理 5.3 .1 接收数据大小 5.3 ...
- 从零开始编写一个上位机(串口助手)QT Creator + Python
提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助. 绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...
- Keil实例仿真AT89C51串口UART收发数据(附程序)
目录 一.引言 二.所用软件 1.串口调试工具 2.虚拟串口软件 3.Keil μVision5 三.软件设置 1.串口调试助手软件设置 2.虚拟串口软件设置 3.Keil C51设置 A.调试(.i ...
- 【32单片机学习】(6)STM32串口+DMA收发不定长数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.DMA介绍 2.串口接收数据 3.实验现象 1.实验电路图 2.串口收发不定长数据视频演示 3.OLED 显示接收数据 ...
- QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号
QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...
- c语言串口通信_stm32 串口通信收发说明
很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了.其实这是对C语言指针的不能熟练应用有关.指针是C语言的灵魂,也是最难的部分, ...
最新文章
- 深度学习利器: TensorFlow系统架构及高性能程序设计
- 04Prism WPF 入门实战 - Module
- Ajax-个人学习记录(2)
- 信息学奥赛一本通 1019:浮点数向零舍入 | OpenJudge NOI 1.2 06
- Memcached安装及配置
- Bailian3670 计算鞍点(POJ NOI0108-05)【矩阵】
- linux 进程和线程或线程和线程之间通过管道通信(pipe)
- 非spring boot (即spring) 使用/集成 Spring cloud Config 分布式配置中心
- 高频电子线路_实验一:调谐放大器
- grep的常用和次常用选项
- mysql 查询半径范围内经纬度坐标
- 转:一个硕士应届生的面试总结.(很精彩,特别是具体的各公司面试信息)
- xunsearch与mysql区别_利用 Xunsearch 搭建搜索引擎、内容搜索实战
- Libnet 1.1教程
- log4j2邮件发送配置
- 几何画板v5.0.6源文件(破解成功)
- 基于S7-200 PLC组态王组态和触摸屏的洗衣机控制系统的设计 熟悉工业电气控制系统的组成,熟悉PLC系统的设计
- maya2020卸载不干净_maya怎样卸载干净,如何完全彻底删除清理干净MAYA各种残留注册表和文件?...
- 【财经期刊FM-Radio|2020年11月24日】
- 面试/深信服科技测试实习电话面试
热门文章
- echarts 双y轴设置
- 《一切都是最好的安排》之感想
- 线性约束最小方差准则
- 微信小程序退款 报错 FAIL 证书验证失败
- R语言----制作数据分布图(直方图+概率密度曲线)
- 计算机开机最快设置,那些电脑开机速度击败全国99%的人,他们是怎么做到的?...
- 完美实现无毛边异形窗体
- BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过
- 搭讪培训班 - 名品试用 - YOKA时尚论坛 - YOKA社区
- 如何使用命令行合成一句话图片木马