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;
}

发布了136 篇原创文章 · 获赞 22 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/102967273