这里写自定义目录标题

  • 头文件

头文件

#pragma once
#ifndef XWSERIAL_H#define XWSERIAL_H#include <iostream>
using namespace std;class cSerialClass
{
public:cSerialClass();~cSerialClass();int open(const char *portname, int bortrate = 115200, char parity = 0, char databit = 8, char stopbit = 1, char synFlag = 1);void close();int send(string dat);string receive();
private:int pHandle[16];char synFlag;
};#endif

#源文件

#include "xwSerial.h"
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
using namespace std;cSerialClass::cSerialClass() {}cSerialClass::~cSerialClass() {}int cSerialClass::open(const char *portname,int bortrate,char parity,char databit,char stopbit,char synFlag)
{this->synFlag = synFlag;HANDLE hCom = NULL;if (this->synFlag){// 同步类型串口hCom = CreateFileA(portname, GENERIC_READ | GENERIC_WRITE, // 可读可写0, // 独占方式,不支持共享NULL,OPEN_EXISTING, // 打开现有的串口文件0,  // 同步方式NULL);}else{// 异步串口hCom = CreateFileA(portname, GENERIC_READ | GENERIC_WRITE, // 可读可写0, // 独占方式,不支持共享NULL,OPEN_EXISTING, // 打开现有的串口文件FILE_FLAG_OVERLAPPED, // 异步方式NULL);}if (hCom == (HANDLE)-1){return -1;}if (!SetupComm(hCom, 1024, 1024)){return -2;}DCB p;memset(&p, 0, sizeof(DCB));p.DCBlength = sizeof(p);p.BaudRate = bortrate;p.ByteSize = databit;switch (parity){case 0:p.Parity = NOPARITY;break;case 1:p.Parity = ODDPARITY;break;case 2:p.Parity = EVENPARITY;break;case 3:p.Parity = MARKPARITY;break;default:break;}switch (stopbit){case 1:p.StopBits = ONESTOPBIT;break;case 2:p.StopBits = TWOSTOPBITS;break;case 3:p.StopBits = ONE5STOPBITS;break;default:break;}if (!SetCommState(hCom, &p)){// 设置参数失败return -3;}// 超时处理 COMMTIMEOUTS timeOuts;timeOuts.ReadIntervalTimeout = 1000;timeOuts.ReadTotalTimeoutMultiplier = 5000;timeOuts.ReadTotalTimeoutConstant = 5000;timeOuts.WriteTotalTimeoutMultiplier = 500;timeOuts.WriteTotalTimeoutConstant = 2000;SetCommTimeouts(hCom, &timeOuts);PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);memcpy(pHandle, &hCom, sizeof(hCom));return 0;
}void cSerialClass::close()
{HANDLE hCom = *(HANDLE*)pHandle;CloseHandle(hCom);
}int cSerialClass::send(string dat)
{HANDLE hCom = *(HANDLE*)pHandle;if (this->synFlag){DWORD dwByteWrite = dat.length();BOOL bWriteStat = WriteFile(hCom,(char*)dat.c_str(),dwByteWrite,&dwByteWrite,NULL);if (!bWriteStat) return 0;return dwByteWrite;}else{DWORD dwByteWrite = dat.length();DWORD dwErrorFlags;COMSTAT comStat; // 通讯状态OVERLAPPED m_osWrite; // 异步输入输出结构体memset(&m_osWrite, 0, sizeof(m_osWrite));m_osWrite.hEvent = CreateEventA(NULL, TRUE, FALSE, "Write Event 111");ClearCommError(hCom, &dwErrorFlags, &comStat);BOOL bWriteStat = WriteFile(hCom,(char*)dat.c_str(),dwByteWrite,&dwByteWrite,&m_osWrite);if (!bWriteStat){if (GetLastError() == ERROR_IO_PENDING) // 串口正在写入{WaitForSingleObject(m_osWrite.hEvent, 1000);}else{ClearCommError(hCom, &dwErrorFlags, &comStat);CloseHandle(m_osWrite.hEvent);return 0;}}return dwByteWrite;}
}string cSerialClass::receive()
{HANDLE hCom = *(HANDLE*)pHandle;string rec_str = "";char buf[1024];if (this->synFlag){DWORD wCount = 1024;BOOL bReadStat = ReadFile(hCom,buf,wCount,&wCount,NULL);for (int i = 0; i < 1024; i++){if (buf[i] != -52){rec_str += buf[i];}elsebreak;}rec_str = buf;return rec_str;}else{DWORD wCount = 1024;DWORD dwErrorFlags;COMSTAT comStat; // 通讯状态OVERLAPPED m_osRead; // 异步输入输出结构体memset(&m_osRead, 0, sizeof(m_osRead));m_osRead.hEvent = CreateEventA(NULL, TRUE, FALSE, "Read Event 222");ClearCommError(hCom, &dwErrorFlags, &comStat);if (!comStat.cbInQue) return 0;BOOL bReadStat = ReadFile(hCom,buf,wCount,&wCount,&m_osRead);if (!bReadStat){if (GetLastError() == ERROR_IO_PENDING) // 串口正在写入{WaitForSingleObject(m_osRead.hEvent, 1000);}else{ClearCommError(hCom, &dwErrorFlags, &comStat);CloseHandle(m_osRead.hEvent);return 0;}}/*for (int i = 0; i < 1024; i++){if (buf[i] != -52){rec_str += buf[i];}elsebreak;}*/rec_str = buf;return rec_str;}
}

##需要注意的点:
com端口<10的时候,可以直接用"COMX",大于10的时候,需要用"\\.\COMX"

windows串口通信CreateFile相关推荐

  1. windows串口通信函数API

    windows串口通讯主要函数 先列个目录表 1.CreateFile - 打开串口: 2.SetupComm-初始化一个指定的通信设备的通信参数 3.ReadFile - 读数据: 4.WriteF ...

  2. Windows串口通信有关的MSComm控件

    问题描述:一般单片机.ARM.FPGA一类的板子基本都会带有RS232串口,因为协议简单,而且成熟,有许多现成的东西可以借鉴使用.在上位机通过串口获取下位机传来的信息或数据,Windows下一般有(1 ...

  3. java调用c 串口_基于C语言的java串口通信程序

    目录 1.前言 2.windows  串口通信API 3.C/C++封装  动态运行库 4.JAVA-JNI  java程序调用C++程序 一.前言 &ensp ;写这个博客主要是因为自己想用 ...

  4. 位掩码(bitmask)在windows 串口事件驱动中的应用

    最近在学习Windows串口通信,以事件驱动模式开发相关应用时,肯定会用到以下几个函数: SetCommMask(HANDLE hComm, DWORD dwEvtMask); GetCommMask ...

  5. VC串口通信(Windows API)

    本文转载自基于Windows API的VC++串口通信详解,以下附上大白的理解. 简介 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二 ...

  6. 基于Windows API的VC++串口通信详解

    在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种 方法可以清楚地掌握串口通信的机制,并且自由灵活. ...

  7. 在WEBSTART中实现串口通信(WINDOWS版)

    在WEBSTART中实现串口通信(WINDOWS版) 看到这个题目,你是不是问:这跟在JAVA中实现串口通信有什么区别?在JAVA中能做在WEBSTART中不就 一样吗? 真聪明,的确是这样的,但事实 ...

  8. 串口通信发送hello windows

    文章目录 一. 原理 1.串口协议 2.RS-232 3.485标准 4.RS232.485电平与TTL电平的区别 5."USB/TTL转232"模块(以CH340芯片模块为例)的 ...

  9. 串口通信下连续输出Hello windows

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 串口通信下连续输出Hello windows! 什么是串口通信 一.代码的编写 二.keil5项目运行 1.创建新工程 2.运行并且烧 ...

最新文章

  1. Java多线程之Callable接口的实现
  2. UA MATH563 概率论的数学基础 中心极限定理20 弱收敛的性质
  3. “花钱矩阵”下共享单车的出路何在?
  4. c++ 重载 覆盖 隐藏的区别和执行方式
  5. 扩展您的JPA POJO
  6. 深度学习pytorch--多层感知机(三)
  7. 【APICloud系列|35】小米应用商店版本更新
  8. java的未检查异常有哪些_Java:检查异常与未检查异常
  9. 【内容管理系统】之 Strapi
  10. 内核与ramdisk到底是什么关系
  11. 萌新的Python练习实例100例(三)一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数
  12. VMware 安装Ubuntu 无法进入安装界面
  13. 贺利坚老师汇编课程73笔记:键盘输入的处理过程
  14. 使用嵌套类/临时类保存数据
  15. 阿里笔试2020/9/4
  16. 【PMI-PMP®模考三】2022
  17. Python爬虫实战:爬取拉勾网并对其进行数据分析
  18. 授权服务是如何颁发授权码和访问令牌的?
  19. Redis面试题从基础到进阶
  20. 《人性的弱点》读书笔记

热门文章

  1. 兰州一中计算机教室,2020中考必备丨每周一校:兰州一中
  2. 常用的Web安全认证方式
  3. 网易云音乐批量下载器v1.1软件介绍(修正版)
  4. yzm10铺瓷砖 一只小蜜蜂 ycb与取款机
  5. unity和虚幻哪个更好
  6. Scrapy爬虫实例——校花网
  7. ZigBee组网(原理分析)
  8. 【问题处理】Plugin execution not covered by lifecycle configuration 最简单!!!
  9. 尚硅谷JavaWeb笔记——书城项目(第五阶段:图书模块(课程精华!!!!))
  10. 十五岁生日快乐,.NET !