个串口通讯的类
/**/
#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);
}

一个好用的串口类(收发自如)相关推荐

  1. 一个由印度人编写的VC串口类

    软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口.写串口等. 这个类有点特别,它没有 ...

  2. 一个印度人写的VC串口类CSerialCom(有串口基础介绍)

    http://www.vc-rs232.com/html/VC_SSCOM_Control/2011/0117/34.html 一个印度人写的VC串口类CSerialCom(有串口基础介绍) 软件介绍 ...

  3. hal库串口dma卡死_HAL库版DMA循环模式串口数据收发

    在<STM32CubeMX初识与工程创建>的基础上,首先对串口进行设置,以实现通过串口对数据的收发.STM32CubeMX生成的HAL库中,提供了三类串口数据收发的接口,分别为阻塞模式,非 ...

  4. 一个严谨的STM32串口DMA发送接收(1.5Mbps波特率)机制

    文章目录 1 前言 2 串口有必要使用DMA吗 3 实现方式 4 STM32串口使用DMA 5 串口DMA接收 5.1 基本流程 5.2 相关配置 5.3 接收处理 5.3 .1 接收数据大小 5.3 ...

  5. 从零开始编写一个上位机(串口助手)QT Creator + Python

    提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助.   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...

  6. Keil实例仿真AT89C51串口UART收发数据(附程序)

    目录 一.引言 二.所用软件 1.串口调试工具 2.虚拟串口软件 3.Keil μVision5 三.软件设置 1.串口调试助手软件设置 2.虚拟串口软件设置 3.Keil C51设置 A.调试(.i ...

  7. 【32单片机学习】(6)STM32串口+DMA收发不定长数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.DMA介绍 2.串口接收数据 3.实验现象 1.实验电路图 2.串口收发不定长数据视频演示 3.OLED 显示接收数据 ...

  8. QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号

    QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...

  9. c语言串口通信_stm32 串口通信收发说明

    很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了.其实这是对C语言指针的不能熟练应用有关.指针是C语言的灵魂,也是最难的部分, ...

最新文章

  1. 深度学习利器: TensorFlow系统架构及高性能程序设计
  2. 04Prism WPF 入门实战 - Module
  3. Ajax-个人学习记录(2)
  4. 信息学奥赛一本通 1019:浮点数向零舍入 | OpenJudge NOI 1.2 06
  5. Memcached安装及配置
  6. Bailian3670 计算鞍点(POJ NOI0108-05)【矩阵】
  7. linux 进程和线程或线程和线程之间通过管道通信(pipe)
  8. 非spring boot (即spring) 使用/集成 Spring cloud Config 分布式配置中心
  9. 高频电子线路_实验一:调谐放大器
  10. grep的常用和次常用选项
  11. mysql 查询半径范围内经纬度坐标
  12. 转:一个硕士应届生的面试总结.(很精彩,特别是具体的各公司面试信息)
  13. xunsearch与mysql区别_利用 Xunsearch 搭建搜索引擎、内容搜索实战
  14. Libnet 1.1教程
  15. log4j2邮件发送配置
  16. 几何画板v5.0.6源文件(破解成功)
  17. 基于S7-200 PLC组态王组态和触摸屏的洗衣机控制系统的设计 熟悉工业电气控制系统的组成,熟悉PLC系统的设计
  18. maya2020卸载不干净_maya怎样卸载干净,如何完全彻底删除清理干净MAYA各种残留注册表和文件?...
  19. 【财经期刊FM-Radio|2020年11月24日】
  20. 面试/深信服科技测试实习电话面试

热门文章

  1. echarts 双y轴设置
  2. 《一切都是最好的安排》之感想
  3. 线性约束最小方差准则
  4. 微信小程序退款 报错 FAIL 证书验证失败
  5. R语言----制作数据分布图(直方图+概率密度曲线)
  6. 计算机开机最快设置,那些电脑开机速度击败全国99%的人,他们是怎么做到的?...
  7. 完美实现无毛边异形窗体
  8. BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过
  9. 搭讪培训班 - 名品试用 - YOKA时尚论坛 - YOKA社区
  10. 如何使用命令行合成一句话图片木马