⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com_control.cpp

📁 实现了串口通信
💻 CPP
字号:
#include "COM_control.h"

_COM::_COM()
{
	hCreate = NULL;
	Success = 0;
	SendEvent.SetEvent();
	RecvEvent.SetEvent();
	memset(&SendOV,0,sizeof(SendOV));		//发送
	SendOV.hEvent=SendEvent;
	memset(&RecvOV,0,sizeof(RecvOV));		//接收
	RecvOV.hEvent=RecvEvent;
	RecvPTR=0;
}

_COM::~_COM()
{
	//delete []ReadData;
}

int _COM::ComInitial( char * ComName)
{
	DCB dcb;
	char *SerialPort = ComName;
	int BaudRate = 9600;

	// 打开串口文件//FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED
	hCreate = CreateFile( SerialPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL );
	if( hCreate == INVALID_HANDLE_VALUE )
	{
		cerr<<"Initial中创建串口出错,错误原因是" <<GetLastError() <<endl;
		return 1;  // 错误,返回
	}
	Success = GetCommState( hCreate,&dcb );
	if( !Success )
	{
		cerr<<"Initial中获得串口状态出错,错误原因是" <<GetLastError() <<endl;
		return 2;  // 错误,返回
	}
    
	// 设置串口状态
	dcb.BaudRate = BaudRate;  // 波特率外部制定
	dcb.ByteSize = 8;         // 8位数据
	dcb.StopBits = ONESTOPBIT;         // 1位停止位
	dcb.Parity = NOPARITY;    // 无奇偶校验
	Success = SetCommState( hCreate,&dcb );
	if( !Success )
	{
		cerr<<"Initial中设置串口状态出错,错误原因是" <<GetLastError() <<endl;
		return 3;  // 错误,返回
	}
	
	// 设置超时时间
	COMMTIMEOUTS TimeSet;
	memset( &TimeSet,0,sizeof(TimeSet) );

	TimeSet.ReadIntervalTimeout = 100;
	TimeSet.ReadTotalTimeoutConstant = 1;
	TimeSet.ReadTotalTimeoutMultiplier = 500;
	TimeSet.WriteTotalTimeoutConstant = 1;
	TimeSet.WriteTotalTimeoutMultiplier = 100;

	Success = SetCommTimeouts(hCreate, &TimeSet);
	if( !Success )
	{
		cerr<<"Initial中设置超时时间出错,错误原因是" <<GetLastError() <<endl;
		return 4;  // 错误,返回
	}

	Success = SetupComm( hCreate,BUFFER_SIZE,BUFFER_SIZE );
	if( !Success )
	{
		cerr<<"Initial中设置缓冲区出错,错误原因是" <<GetLastError() <<endl;
		return 5;  // 错误,返回
	}
	PurgeComm( hCreate,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );  // 全部清空
    Success = SetCommMask( hCreate,EV_TXEMPTY | EV_RXCHAR );  // 设置等待事件
	if( !Success )
	{
		cerr<<"Initial中设置SetCommMask出错,错误原因是" <<GetLastError() <<endl;
		return 1;  // 错误,返回
	}

	return 0;  //成功
}

int _COM::WriteCom( PACKAGE pck)
{
	ULONG SentLen;
    //PurgeComm( hCreate,PURGE_TXCLEAR );           // 清空发送缓冲区
	Success = WriteFile( hCreate,&pck,sizeof(PACKAGE),&SentLen,&SendOV );
    GetOverlappedResult(hCreate,&SendOV,&SentLen,TRUE);		//等待发送完成
    SendEvent.ResetEvent();
	return 0;
}

PACKAGE* _COM::ReadCom( void )
{
		ULONG	ReadLen;
		ReadFile(hCreate,(char *)&RecvPck,sizeof(PACKAGE),&ReadLen,&RecvOV); //读字符
		GetOverlappedResult(hCreate,&RecvOV,&ReadLen,TRUE);		//等待读状态完成		
		RecvEvent.ResetEvent();//复位事件变量
		return &RecvPck;
}

int _COM::CloseCom()
{
	Success = CloseHandle( hCreate );
	if( !Success )
	{
		cerr<<"关闭串口出错,错误原因是" <<GetLastError() <<endl;
		return 1;  // 错误,返回
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -