资源简介
本程序中实现了c++串口异步通信,并对主要的函数功能及形参含义做了详细的注释,代码实测正确!
关于程序的解释可参见本人撰写博客:
https://blog.csdn.net/sinat_35728816/article/details/81632310
关于程序的解释可参见本人撰写博客:
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\li
文件 5252 2018-08-12 21:25 Mark_com\Ma_com\Debug\Ma_com.tlog\li
文件 576 2018-08-12 21:25 Mark_com\Ma_com\Debug\Ma_com.tlog\li
文件 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个文件信息
- 上一篇:MFCaccess.rar
- 下一篇:opencv激光中心线的提取
相关资源
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
- c++ 虚拟摄像头
- hook,捕获所有案件,查找所有窗口,
- C语言课设计算器
- c++ 简易贪吃蛇源码
- 高精度加法(c++代码)
- C++调用百度地图案例
- 北京化工大学计算方法(C/C++)讲义
- 基于VC++的SolidWorks二次开发SolidWorks
- c++ 模拟鼠标按键
- OFD编辑器
- Beginning C++17 From Novice to Professional
- C++ STL实现
- opencv手部轮廓识别以及轨迹识别
- 百度C++编码规范
- C++ sql2008 WebServer通讯.docx
- c++ 定时关机程序源码
- 基于VSCode和CMake实现C++开发
- c++语法查询工具
- c++ 账务系统源码
评论
共有 条评论