📄 从网上的c#串口通信源码例子转换成的c++串口通信代码——commport.hpp
字号:
#ifndef MY_INCLUDE__COMMPORT_H
#define MY_INCLUDE__COMMPORT_H
#include "winbase.h"
#define uint unsigned int
#define byte char
#define ushort unsigned short
#define my_internal
#define my_ref
#define my_const
#include <string>
using namespace std;
///<summary>
/// API串口类 叶帆修改 http://blog.csdn.net/yefanqiu
///</summary>
class CommPort
{
///<summary>
///端口名称(COM1,COM2...COM4...)
///</summary>
public: string Port;
///<summary>
///波特率9600
///</summary>
public: int BaudRate;
///<summary>
///数据位4-8
///</summary>
public: byte ByteSize; //4-8
///<summary>
///奇偶校验0-4=no,odd,even,mark,space
///</summary>
public: byte Parity; //0-4=no,odd,even,mark,space
///<summary>
///停止位
///</summary>
public: byte StopBits; //0,1,2 = 1, 1.5, 2
///<summary>
///超时长
///</summary>
public: int ReadTimeout;
///<summary>
///串口是否已经打开
///</summary>
public: bool Opened;
///<summary>
/// COM口句柄
///</summary>
private: HANDLE hComm;
public: CommPort()
{
Port = "COM1:";
BaudRate = 9600;
ByteSize = 8; //4-8
Parity = 0; //0-4=no,odd,even,mark,space
StopBits = 0; //0,1,2 = 1, 1.5, 2
ReadTimeout = 200;
Opened = false;
hComm = (HANDLE)-1;
M_DLLPATH = "C:\\windows\\system32\\kernel32.dll"; // "kernel32";
M_GENERIC_READ = 0x80000000;
M_GENERIC_WRITE = 0x40000000;
M_OPEN_EXISTING = 3;
M_INVALID_HANDLE_VALUE = -1;
M_PURGE_RXABORT = 0x2;
M_PURGE_RXCLEAR = 0x8;
M_PURGE_TXABORT = 0x1;
M_PURGE_TXCLEAR = 0x4;
};
//#region "API相关定义"
private: my_const string M_DLLPATH; // "kernel32";
///<summary>
/// WINAPI常量,写标志
///</summary>
private: my_const uint M_GENERIC_READ;
///<summary>
/// WINAPI常量,读标志
///</summary>
private: my_const uint M_GENERIC_WRITE;
///<summary>
/// WINAPI常量,打开已存在
///</summary>
private: my_const int M_OPEN_EXISTING;
///<summary>
/// WINAPI常量,无效句柄
///</summary>
private: my_const int M_INVALID_HANDLE_VALUE;
private: my_const int M_PURGE_RXABORT;
private: my_const int M_PURGE_RXCLEAR;
private: my_const int M_PURGE_TXABORT;
private: my_const int M_PURGE_TXCLEAR;
///<summary>
///设备控制块结构体类型
///</summary>
//[StructLayout(LayoutKind.Sequential)]
/**************************************
public: struct DCB
{
///<summary>
/// DCB长度
///</summary>
public: int DCBlength;
///<summary>
///指定当前波特率
///</summary>
public: int BaudRate;
///<summary>
///标志位
///</summary>
public: uint flags;
///<summary>
///未使用,必须为0
///</summary>
public: ushort wReserved;
///<summary>
///指定在XON字符发送这前接收缓冲区中可允许的最小字节数
///</summary>
public: ushort XonLim;
///<summary>
///指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数
///</summary>
public: ushort XoffLim;
///<summary>
///指定端口当前使用的数据位
///</summary>
public: byte ByteSize;
///<summary>
///指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY 0-4=no,odd,even,mark,space
///</summary>
public: byte Parity;
///<summary>
///指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS 0,1,2 = 1, 1.5, 2
///</summary>
public: byte StopBits;
///<summary>
///指定用于发送和接收字符XON的值 Tx and Rx XON character
///</summary>
public: byte XonChar;
///<summary>
///指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
///</summary>
public: byte XoffChar;
///<summary>
///本字符用来代替接收到的奇偶校验发生错误时的值
///</summary>
public: byte ErrorChar;
///<summary>
///当没有使用二进制模式时,本字符可用来指示数据的结束
///</summary>
public: byte EofChar;
///<summary>
///当接收到此字符时,会产生一个事件
///</summary>
public: byte EvtChar;
///<summary>
///未使用
///</summary>
public: ushort wReserved1;
};
**************************************/
///<summary>
///串口超时时间结构体类型
///</summary>
//[StructLayout(LayoutKind.Sequential)]
/**********************************************
private: struct COMMTIMEOUTS
{
public: int ReadIntervalTimeout;
public: int ReadTotalTimeoutMultiplier;
public: int ReadTotalTimeoutConstant;
public: int WriteTotalTimeoutMultiplier;
public: int WriteTotalTimeoutConstant;
};
**********************************************/
///<summary>
///溢出缓冲区结构体类型
///</summary>
//[StructLayout(LayoutKind.Sequential)]
/**********************************************
private: struct OVERLAPPED
{
public: int Internal;
public: int InternalHigh;
public: int Offset;
public: int OffsetHigh;
public: int hEvent;
};
**********************************************/
///<summary>
///打开串口
///</summary>
///<param name="lpFileName">要打开的串口名称</param>
///<param name="dwDesiredAccess">指定串口的访问方式,一般设置为可读可写方式</param>
///<param name="dwShareMode">指定串口的共享模式,串口不能共享,所以设置为0</param>
///<param name="lpSecurityAttributes">设置串口的安全属性,WIN9X下不支持,应设为NULL</param>
///<param name="dwCreationDisposition">对于串口通信,创建方式只能为OPEN_EXISTING</param>
///<param name="dwFlagsAndAttributes">指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信</param>
///<param name="hTemplateFile">对于串口通信必须设置为NULL</param>
//[DllImport(DLLPATH)]
//**********private: static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode,
//**********int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
///<summary>
///得到串口状态
///</summary>
///<param name="hFile">通信设备句柄</param>
///<param name="lpDCB">设备控制块DCB</param>
//[DllImport(DLLPATH)]
//**********private: static extern bool GetCommState(int hFile, my_ref DCB lpDCB);
///<summary>
///建立串口设备控制块(嵌入版没有)
///</summary>
///<param name="lpDef">设备控制字符串</param>
///<param name="lpDCB">设备控制块</param>
//[DllImport(DLLPATH)]
//private: static extern bool BuildCommDCB(string lpDef, my_ref DCB lpDCB);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -