当前位置: 首页 > news >正文

C++连接串口方式(MFC版本)(简单版本)

ComSerialPort.h

/*_________________________串口________________________________*/class Com_SerialPort
{
public:Com_SerialPort();Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits);~Com_SerialPort();
public:bool Connect(bool bMutex = false) override;void DisConnect(bool bMutex = false) override;bool clearBuf_c();bool recvBuf_c(char* pStr, int& len, int waitTimeMS = 0) override;bool sendBuf_c(char const *pStr, const int& len) override;
private:BOOL setReadTime(DWORD time);
private:HANDLE m_hCom;DCB m_dcb;COMMTIMEOUTS m_timeOuts;
};

ComSerialPort.cpp

/*_________________________串口________________________________*/Com_SerialPort::Com_SerialPort()
{m_dcb.BaudRate = 9600;			//波特率为9600m_dcb.ByteSize = 8;				//每个字节有8位m_dcb.Parity = NOPARITY;		//无奇偶校验位m_dcb.StopBits = ONESTOPBIT;	//1个停止位m_typeName = "串口";//设定读超时m_timeOuts.ReadIntervalTimeout = 100;//读间隔超时m_timeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数 m_timeOuts.ReadTotalTimeoutConstant = 1000;//读时间常量 //设定写超时m_timeOuts.WriteTotalTimeoutMultiplier = 500; // 写时间系数 m_timeOuts.WriteTotalTimeoutConstant = 2000;//写时间常量 
}Com_SerialPort::Com_SerialPort(int port, int baudRate, int byteSize, int parity, int stopBits)
{m_Port = port;m_dcb.BaudRate = baudRate;			//波特率为9600;m_dcb.ByteSize = byteSize;			//每个字节有8位;m_dcb.Parity = parity;				//无奇偶校验位;m_dcb.StopBits = stopBits;			//1个停止位;m_typeName = "串口";//设定读超时m_timeOuts.ReadIntervalTimeout = 100;//读间隔超时m_timeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数 m_timeOuts.ReadTotalTimeoutConstant = 1000;//读时间常量 //设定写超时m_timeOuts.WriteTotalTimeoutMultiplier = 500; // 写时间系数 m_timeOuts.WriteTotalTimeoutConstant = 2000;//写时间常量 
}Com_SerialPort::~Com_SerialPort()
{
}bool Com_SerialPort::Connect(bool bMutex)
{QMutexLocker locker(&m_Mutex);DisConnect(false);char str_c[256];memset(str_c, '\0', 256);snprintf(str_c, sizeof(str_c), "COM%d", m_Port);std::string ComStr(str_c);WCHAR wComName[128];memset(wComName, '\0', sizeof(wComName));MultiByteToWideChar(CP_ACP, 0, ComStr.c_str(), -1, wComName, sizeof(wComName) / sizeof(wComName[0]));m_hCom = CreateFile(wComName,//COM1口GENERIC_READ | GENERIC_WRITE, //允许读和写;0, //独占方式;NULL,OPEN_EXISTING, //打开而不是创建;0, //同步方式;NULL);//if (hCom1 == (HANDLE)-1)if (m_hCom == INVALID_HANDLE_VALUE){printf("打开COM失败!\n");m_bConnectOK = false;return false;}SetupComm(m_hCom, CHAR_LEN, CHAR_LEN); //输入缓冲区和输出缓冲区的大小都是1024//设定读超时BOOL RTN = SetCommTimeouts(m_hCom, &m_timeOuts); //设置超时DCB dcb;GetCommState(m_hCom, &dcb);dcb.BaudRate = m_dcb.BaudRate;		//波特率为9600dcb.ByteSize = m_dcb.ByteSize;		//每个字节有8位dcb.Parity = m_dcb.Parity;			//无奇偶校验位dcb.StopBits = m_dcb.StopBits;		//1个停止位SetCommState(m_hCom, &dcb);m_bConnectOK = true;return true;
}void Com_SerialPort::DisConnect(bool bMutex)
{if (bMutex)m_Mutex.lock();if (m_hCom != INVALID_HANDLE_VALUE){CloseHandle(m_hCom);m_hCom = INVALID_HANDLE_VALUE;m_bConnectOK = false;}if (bMutex)m_Mutex.unlock();
}bool Com_SerialPort::clearBuf_c()
{QMutexLocker locker(&m_Mutex);setReadTime(200);DWORD initTime = GetTickCount();do{DWORD readsize = 0;ReadFile(m_hCom, m_recvBuffer, CHAR_LEN, &readsize, NULL);if (readsize <= 0)return true;if (abs(int(GetTickCount() - initTime)) > 1000)return false;} while (1);return false;
}bool Com_SerialPort::recvBuf_c(char * pStr, int & len, int waitTimeMS)
{QMutexLocker locker(&m_Mutex);DWORD readsize = 0;setReadTime(waitTimeMS);ReadFile(m_hCom, pStr, CHAR_LEN, &readsize, NULL);len = readsize;return readsize>0;
}bool Com_SerialPort::sendBuf_c(char const * pStr, const int & len)
{QMutexLocker locker(&m_Mutex);BOOL rtn = WriteFile(m_hCom, pStr, len, NULL, NULL);return rtn != 0;
}BOOL Com_SerialPort::setReadTime(DWORD time)
{if (time != m_timeOuts.ReadTotalTimeoutConstant){//读时间常量m_timeOuts.ReadTotalTimeoutConstant = time;return SetCommTimeouts(m_hCom, &m_timeOuts); //设置超时}return 0;
}
http://www.lryc.cn/news/122371.html

相关文章:

  • ospf重发布
  • 基于weka手工实现K-means
  • 分布式系统监控zabbix安装部署及使用
  • 【H5】使用 JavaScript 和 CSS 来完成实现鼠标接触时显示一个图片弹窗
  • CSS选择器分类梳理并高亮重点
  • Python批量给excel文件加密
  • 程序设计 树基础
  • Java 并发编程与CAS基本原理
  • qt creater运行按钮灰色,问题记录
  • 【jvm】类加载器的分类
  • 电路基础之电容
  • 函数柯里化
  • 【HBZ分享】ES中的Reindex重建索引
  • 【PostgreSQL】几个提高性能的小特性
  • [C语言] 指针
  • win10在vmware15中安装macos10.13系统
  • Node.js:实现遍历文件夹下所有文件
  • Git详解及使用
  • Jmeter设置中文的两种方式,建议使用第二种
  • 【ARM 嵌入式 编译系列 7.1 -- GCC 链接脚本中节区及各个段的详细介绍】
  • 一文读懂HTML
  • MOCK测试
  • Flutter源码分析笔记:Widget类源码分析
  • PyTorch 微调终极指南:第 2 部分 — 提高模型准确性
  • MySQL数据库----------安装anaconda---------python与数据库的链接
  • nuxt页面布局
  • mac编译ffmpeg
  • 如何让你的图片服务也有类似OSS的图片处理功能
  • Oracle PL/SQL 类型(Type):索引表、嵌套表、变长数组、pipelined 管道
  • Web 服务器 -【Tomcat】的简单学习