MFC 串口编程实例

VC串口编程从实现方法上一般分为两种,一种使用MSCOMM控件,这种方法比较简单,软件的移植性较低,在这里介绍一种串口封装类的使用方法。


代码

先看代码 CommUtils.cpp


#include "stdafx.h"
#include "CommUtils.h"
#include "stdio.h"
const int READ_TIMEOUT = 500;CommUtils::CommUtils()
{bOpenCom = false;
}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,NULL);int error=GetLastError();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;        // baud rate 9600dcb.ByteSize = 8;               dcb.Parity = NOPARITY;            dcb.StopBits = ONESTOPBIT;        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;}/*bResult = ReadFile(port->m_hComm,  // Handle to COMM port &RXBuff,    // RX Buffer Pointer1,     // Read one byte              &BytesRead,   // Stores number of bytes read               &port->m_ov);  // pointer to the m_ov structure                              // deal with the error code */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;
}

头文件CommUtils.h

#ifndef _CommUtils_H__
#define _CommUtils_H__class CommUtils
{
public:bool ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength);void CloseCom();bool WriteCom(unsigned char * sendchar,int sendsize);bool OpenCom(int Port);CommUtils();virtual ~CommUtils();int m_Port;char szCurPath[256];private:OVERLAPPED ReadovReady, WriteovReady;HANDLE hComm;bool bOpenCom;
};#endif

使用方法

1.将.cpp .h 文件拷贝到工程目录下;
2.右击项目—>添加—>现有项,将CommUtils.cpp CommUtils.h 添加进来
3.在自己的对话框类中包含该类的头文件

#include "CommUtils.h"

定义一个全局变量

CommUtils mCommUtils ;

接下来通过CommUtils 的实例mCommUtils 来操作串口
打开串口:

int Port;  //要操作的串口号
mCommUtils.OpenCom(Port);  //打开串口

读串口数据:

unsigned char COMdata[100]; //接收的数据
unsigned long len = 0;
mCommUtils.WriteCom(COMdata, len);

写数据:

unsigned char SendArr[6];
mCommUtils.WriteCom(SendArr,6)

最后关闭串口:

mCommUtils.CloseCom();

该类的析构函数中也调用了该函数,在对象被销毁时也会关掉串口。

最后

串口封装类的下载地址:CommUtils
只是想和大家分享经验,但是下载最少需要1个积分,大家可在自己的工程里右击—>添加—>类 ; 将代码复制过去,注意类名的变化,新建类的类名直接填CommUtils。

MFC 串口编程实例相关推荐

  1. 基于MFC串口编程和曲线图绘制(visual studio2008,Teechart绘图控件)的程序总结

    前言 今年刚进入公司按经理的要求为底盘测控机写了一个小小的console.这也是第一次教认真的完成整个程序的编写.程序不大,所用技术比较基础也不前卫,属于初级程序员的练手程序(知识的整理和搬运).虽然 ...

  2. MFC 串口编程详细教程 图文并茂

    转载:http://blog.csdn.net/a_runing_man/article/details/9947343 本人之前从未接触MFC编程,由于项目需要,所以上网查阅了相关资料,并实现了上位 ...

  3. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式

    点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成  推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...

  4. android串口编程实例_PLC编程由浅到深 | 如何搞懂西门子PLC脉冲输出

    点击箭头处"工业之家",选择"关注公众号"! 如何搞懂西门子PLC脉冲输出 西门子S7-200PLC有两个PT0/PWM发生器(脉冲输出/脉宽调制),它们可以产 ...

  5. python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...

  6. python3.6串口编程实例_使用python3实现操作串口详解

    通过引用serial模块包,来操作串口. 1.查看串口名称 在Linux和Windows中,串口的名字规则不太一样. 需要事先查看. Linux下的查看串口命令 root@D2:~# ls -l /d ...

  7. python串口编程_- python串口编程实例

    python读取串口信息#e# 4.python简单程序读取串口信息的方法 具体分析如下: 这段代码需要调用serial模块,通过while循环不断读取串口数据 5.Python简单串口收发GUI界面 ...

  8. python串口通信_python串口编程实例 - 全文

    Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其 ...

  9. python开发串口通信界面_python串口编程实例

    Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其 ...

最新文章

  1. 文言文编程还不够好玩?这里有个16岁高中生开发的粤语编程项目,GitHub star量600+...
  2. ESXi 6.5 进入维护模式死机在68%的进度的bug
  3. Mybatis使用接口开发
  4. python语音播报库-基于python GUI开发的点名小程序(语音播报)
  5. thymeleaf基本语法
  6. Tornado報錯AttributeError: Unrecognized option 'port'
  7. Java技术:Optional 相关用法介绍笔记
  8. ABP的新旧版本选型
  9. Android JNI(一)——NDK与JNI基础
  10. 【Http】加解密 生成 X.509格式,DER编码,后缀名.cer 加密公钥证书
  11. 设计模式-责任链模式(17)
  12. eviews建立时间序列模型_Eviews系列12|时间序列模型常见问题解答
  13. 计算机操作系统第四版课后全部习题答案
  14. w ndows10隐藏桌面设置,Win10双击桌面隐藏/显示图标?这个可以有
  15. Sophix热修复的简单使用
  16. 易基因|植物中m6A甲基化酶调节机制:组成、功能和进化
  17. android 仿微信账单生成器手机版式,2020微信年度账单生成器
  18. Oracle表中添加字段及描述
  19. ios wkweb设置图片_iOS WKWebView识别H5中的图片资源
  20. c语言编数控机床宏程序,数控车床宏程序怎么编啊?

热门文章

  1. directx初第二卷
  2. Linux基本命令及安装jdk配置
  3. Java 中的 ArrayList 类基础使用
  4. centos之rpm包管理器全解
  5. 实验二十五——IEEE 802.11p和VANET仿真
  6. matlab paillier加密_叶胜超:一分钟了解Paillier同态加密算法以及经典应用(118)...
  7. BAT的智慧城市梦,该醒醒了
  8. html 超链接之锚点
  9. filter与ifilter
  10. 同一纬度地区经度相差一度相差多少米?