win32 串口阻塞的方式发送接收数据

参考博文

https://blog.csdn.net/liuzhuomju/article/details/7479507

#pragma once
#define RX_CHAR    WM_USER+1
class CMySerialPort
{
private:
	HANDLE	m_hThread;
	bool m_IsOpen;
	
public:
	OVERLAPPED m_tOverLaped;   
	bool m_IsFun;
	HANDLE  m_hCom;
	CWnd *m_pWnd;
public:
	CMySerialPort(void);
	~CMySerialPort(void);
public:
	bool OpenPort(CString port,CWnd *pWnd);
	bool ClosePort(void);
	bool SetParament(DWORD BaudRate = 9600,
					 BYTE Parity = ODDPARITY,        /* 0-4  =  NOPARITY,ODDPARITY,EVENPARITY,MARKPARITY,SPACEPARITY  */
					 BYTE ByteSize =8,
					 BYTE StopBits = 0);			 //0,1,2 = 1, 1.5, 2  
	bool ReadData(unsigned char *buf,UINT &len);
	bool WriteData(unsigned char *buf,UINT len);
	

};

 

#include "StdAfx.h"
#include "MySerialPort.h"


CMySerialPort::CMySerialPort(void)
{
	m_hCom = NULL;
	m_pWnd = NULL;
	m_hThread=NULL;
	m_IsOpen = false;
	memset(&m_tOverLaped,0,sizeof(OVERLAPPED));
	m_tOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建一个事件
}


CMySerialPort::~CMySerialPort(void)
{
}

bool CMySerialPort::OpenPort(CString port,CWnd *pWnd)
{
	bool flag = false;
	if(m_IsOpen)
		ClosePort();
	m_hCom = CreateFile(port,       //打开串口1
					GENERIC_READ|GENERIC_WRITE, //允许读和写操作
					0,                          //独占方式
					NULL,
					OPEN_EXISTING,              //打开一个存在的串口
					FILE_ATTRIBUTE_NORMAL,//|FILE_FLAG_OVERLAPPED, //异步方式打开
					NULL
					);
	if (m_hCom!=INVALID_HANDLE_VALUE)
	{
		m_pWnd = pWnd;
		m_IsOpen = true;
		flag =  true;
	}
	return flag;
}
bool CMySerialPort::ClosePort(void)
{
	if(m_IsOpen)
	{
		m_IsFun =false;
		m_IsOpen = false;
		if(CloseHandle(m_hCom))
			return true;
		else
			return false;
	}
	else
		return false;
}
bool CMySerialPort::SetParament(DWORD BaudRate,BYTE Parity,BYTE ByteSize,BYTE StopBits )
{
	SetupComm(m_hCom,1024,1024); //设置发送和接收缓冲区大小
	//设置串口信息
	DCB dcb;
	GetCommState(m_hCom,&dcb);
	dcb.BaudRate = 9600;
	dcb.fBinary = TRUE;
	dcb.fParity = TRUE;
	dcb.ByteSize = 8;
	dcb.Parity = ODDPARITY;
	dcb.StopBits = ONESTOPBIT;
	if (!SetCommState(m_hCom,&dcb))//设置串口状态
	{

		return false;         
	}
	if (!SetCommMask(m_hCom,EV_RXCHAR | EV_TXEMPTY))//设置串口掩码
	{

		return false;
	}
	COMMTIMEOUTS timeout;
	timeout.ReadIntervalTimeout = 50;
	timeout.ReadTotalTimeoutMultiplier = 50;
	timeout.ReadTotalTimeoutConstant = 500;
	timeout.WriteTotalTimeoutConstant = 500;
	timeout.WriteTotalTimeoutMultiplier = 50;
	SetCommTimeouts(m_hCom, &timeout);

	return true;
}
bool CMySerialPort::ReadData(unsigned char *DataBuffer,UINT &len)
{
	COMSTAT rst;
	bool flag = false;
	ClearCommError(m_hCom,NULL,&rst); 
	//读取数据到缓冲区中
	if (ReadFile(m_hCom,DataBuffer,len,NULL,NULL)>0) 
	{
		
		flag = true;
	
	}
	return flag;
}
bool CMySerialPort::WriteData(unsigned char *buf,UINT len)
{
	bool flag = false;
	if(m_IsOpen)
	{
		if (WriteFile(m_hCom, buf, len, NULL,NULL)>0)
		{
		
			flag = true;
		}		
			
	}
	return flag;
}

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值