资源简介

本程序中实现了c++串口异步通信,并对主要的函数功能及形参含义做了详细的注释,代码实测正确!
关于程序的解释可参见本人撰写博客:
https://blog.csdn.net/sinat_35728816/article/details/81632310

资源截图

代码片段和文件信息

#include “stdafx.h“
#include 
#include “com.h“
#include 

My_Com::My_Com() :
hCom(INVALID_HANDLE_VALUE)
m_IsOpen(false)
m_Thread(NULL)
{
//void *memset(void *s int ch size_t n);将s中当前位置后面的n个字节用ch替换并返回s 
memset(&m_ovWait 0 sizeof(m_ovWait));
memset(&m_ovWrite 0 sizeof(m_ovWrite));
memset(&m_ovRead 0 sizeof(m_ovRead));
}

My_Com::~My_Com()
{
Close_Com();
}

bool My_Com::Open_Com(LPCWSTR  Port)
{
hCom = CreateFile(
Port //将要打开的串口逻辑名
GENERIC_READ | GENERIC_WRITE //允许读和写
0 //指定共享属性,由于串口不能共享,该参数必须置为0独占方式
NULL//引用安全性属性结构,缺省值为NULL
OPEN_EXISTING //打开而不是创建
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED //重叠方式
NULL //对串口而言该参数必须置为NULL
);
if (hCom == INVALID_HANDLE_VALUE)
{
printf (“打开串口失败!\n“);
return FALSE;
}
else
{
printf(“打开串口成功!\n“);
}
return TRUE;
}

bool My_Com::Config_Com()
{
SetupComm(hCom 1024 1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts; //设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 500;
TimeOuts.WriteTotalTimeoutConstant = 2000;
SetCommTimeouts(hCom &TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom &dcb);
dcb.BaudRate = 9600; //波特率为9600
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = TWOSTOPBITS; //两个停止位
SetCommState(hCom &dcb);

PurgeComm(hCom PURGE_TXCLEAR | PURGE_RXCLEAR);

m_ovRead.hEvent = CreateEvent(NULL false false NULL);
m_ovWrite.hEvent = CreateEvent(NULL false false NULL);
m_ovWait.hEvent = CreateEvent(NULL false false NULL);

//SetCommMask设置要监控的事件 
//EV_RXCHAR:输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区。
//EV_ERR:线路状态错误,包括了CE_frame / CE_OVERRUN / CE_RXPARITY 3种错误。
SetCommMask(hCom EV_ERR | EV_RXCHAR);

//_beginThreadex创建读取线程  
m_Thread = (HANDLE)_beginthreadex(NULL 0 &My_Com::ComRecv this 0 NULL);
m_IsOpen = true;

return TRUE;
}

bool My_Com::ComWrite(LPBYTE buf int &len)
{
BOOL rtn = FALSE;
DWORD WriteSize = 0;   //DWORD 代表 unsigned long
PurgeComm(hCom PURGE_TXCLEAR | PURGE_TXABORT);
m_ovWait.Offset = 0;
rtn = WriteFile(hCom buf len &WriteSize &m_ovWrite);
if (FALSE == rtn && GetLastError() == ERROR_IO_PENDING)//后台读取
{
//等待数据写入完成
printf(“已发送 :“);
for (int i = 0; i < len; i++)
printf(“%d “ buf[i]);
printf(“\n“);
}
return rtn != FALSE;
}

unsigned int __stdcall My_Com::ComRecv(void* LPParam)
{
My_Com *obj = static_cast(LPParam);
DWORD WaitEvent = 0 Bytes = 0;
BOOL Status = FALSE;
BYTE ReadBuf[4096];
DWORD Error;
COMSTAT cs = { 0 };
int i;
while (obj->m_IsOpen)
{
WaitEvent = 0;
obj->m_ovWait.Offset = 0;
Status = WaitCommEvent(obj->hCom &WaitEvent &obj->m_ovWait);
/*
WaitCommEvent等待串口通信事件的发生
用途:用来判断用SetCommMask()函数设置的串口通信事件是否已发生。
原型:BOOL WaitCommEvent(HANDLE hFileLPDWORD lpEvtMaskLPOVERLAPPED lpO

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-08-12 17:06  Mark_com\
     目录           0  2018-08-12 16:01  Mark_com\.vs\
     目录           0  2018-08-12 16:01  Mark_com\.vs\Ma_com\
     目录           0  2018-08-12 21:30  Mark_com\.vs\Ma_com\v15\
     文件       50176  2018-08-12 21:30  Mark_com\.vs\Ma_com\v15\.suo
     文件    72404992  2018-08-12 21:30  Mark_com\.vs\Ma_com\v15\Browse.VC.db
     目录           0  2018-08-12 17:36  Mark_com\.vs\Ma_com\v15\ipch\
     文件     3670016  2018-08-12 21:23  Mark_com\.vs\Ma_com\v15\ipch\469c7ee59f05ae65.ipch
     目录           0  2018-08-12 21:25  Mark_com\Debug\
     文件      130560  2018-08-12 21:25  Mark_com\Debug\Ma_com.exe
     文件      905520  2018-08-12 21:25  Mark_com\Debug\Ma_com.ilk
     文件     1593344  2018-08-12 21:25  Mark_com\Debug\Ma_com.pdb
     目录           0  2018-08-12 21:22  Mark_com\Ma_com\
     目录           0  2018-08-12 21:25  Mark_com\Ma_com\Debug\
     文件         924  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.Build.CppClean.log
     文件         242  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.log
     文件      246588  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.obj
     文件     3014656  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.pch
     目录           0  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\
     文件        2366  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\CL.command.1.tlog
     文件       71272  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\CL.read.1.tlog
     文件        1478  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\CL.write.1.tlog
     文件         206  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\Ma_com.lastbuildstate
     文件        1238  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\link.command.1.tlog
     文件        5252  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\link.read.1.tlog
     文件         576  2018-08-12 21:25  Mark_com\Ma_com\Debug\Ma_com.tlog\link.write.1.tlog
     文件      163983  2018-08-12 21:25  Mark_com\Ma_com\Debug\com.obj
     文件        5856  2018-08-12 21:25  Mark_com\Ma_com\Debug\stdafx.obj
     文件      674816  2018-08-12 21:25  Mark_com\Ma_com\Debug\vc141.idb
     文件      700416  2018-08-12 21:25  Mark_com\Ma_com\Debug\vc141.pdb
     文件        1456  2018-08-12 17:38  Mark_com\Ma_com\Ma_com.cpp
............此处省略9个文件信息

评论

共有 条评论