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

📄 serialport.cpp

📁 串口通信程序,适用于手机的软件更新
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// SerialPort.cpp: implementation of the CSerialPort class.
//
//////////////////////////////////////////////////////////////////////
	
/////////////////////////////////////////////////////data////////////////////////////////////


#include "stdafx.h"
//#include "hasp.h" 
#include "SerialPort.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//#include "ComDebugDlg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
UCHAR command[100];

UCHAR command_N[100] ={(char)0x80,(char)0x81,(char)0x82,(char)0x83,(char)0x84,(char)0x85,(char)0x86,(char)0x87,(char)0x88,(char)0x89
					  ,(char)0x1c,(char)0x64,(char)0x6f,(char)0x77,(char)0x6e,(char)0x6c,(char)0x6f
					  ,(char)0x61,(char)0x64,(char)0x20,(char)0x69,(char)0x64,(char)0x65,(char)0x6e
					  ,(char)0x74,(char)0x69,(char)0x66,(char)0x69,(char)0x63,(char)0x61,(char)0x74
					  ,(char)0x69,(char)0x6f,(char)0x6e,(char)0x20,(char)0x61,(char)0x72,(char)0x65
					  ,(char)0x61					////  command_N+10 ~~~~ command_N+38
					  ,(char)0x8a,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//write
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00	//add
					  ,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//size command_N+39~~51
					  ,(char)0x86,(char)0x00,(char)0x02,(char)0x00,(char)0x00  //size
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00		//add	command_N+52~~60


					  };

UCHAR command_O[100] ={(char)0xE0,(char)0xE1,(char)0xE2,(char)0xE3,(char)0xE4,(char)0xE5,(char)0xE6,(char)0xE7,(char)0xE8,(char)0xE9
					  ,(char)0x1c,(char)0x64,(char)0x6f,(char)0x77,(char)0x6e,(char)0x6c,(char)0x6f
					  ,(char)0x61,(char)0x64,(char)0x20,(char)0x69,(char)0x64,(char)0x65,(char)0x6e
					  ,(char)0x74,(char)0x69,(char)0x66,(char)0x69,(char)0x63,(char)0x61,(char)0x74
					  ,(char)0x69,(char)0x6f,(char)0x6e,(char)0x20,(char)0x61,(char)0x72,(char)0x65
					  ,(char)0x61					////  command_O+10 ~~~~ command_O+38
					  ,(char)0xEa,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//write
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00	//add
					  ,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//size command_O+39~~51
					  ,(char)0xE6,(char)0x00,(char)0x02,(char)0x00,(char)0x00  //read size
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00		//add	command_O+52~~60

					  };

UCHAR command_Z[100] ={(char)0xF0,(char)0xF1,(char)0xF2,(char)0xF3,(char)0xF4,(char)0xF5,(char)0xF6,(char)0xF7,(char)0xF8,(char)0xF9
					  ,(char)0x1c,(char)0x64,(char)0x6f,(char)0x77,(char)0x6e,(char)0x6c,(char)0x6f
					  ,(char)0x61,(char)0x64,(char)0x20,(char)0x69,(char)0x64,(char)0x65,(char)0x6e
					  ,(char)0x74,(char)0x69,(char)0x66,(char)0x69,(char)0x63,(char)0x61,(char)0x74
					  ,(char)0x69,(char)0x6f,(char)0x6e,(char)0x20,(char)0x61,(char)0x72,(char)0x65
					  ,(char)0x61					////  command_O+10 ~~~~ command_O+38
					  ,(char)0xFa,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//write
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00	//add
					  ,(char)0x00,(char)0x02,(char)0x00,(char)0x00	//size command_O+39~~51
					  ,(char)0xE6,(char)0x00,(char)0x02,(char)0x00,(char)0x00  //read size
					  ,(char)0x00,(char)0x36,(char)0x00,(char)0x00		//add	command_O+52~~60

					  };

UCHAR Band_command[100] ={(char)0x80,(char)0xFF,(char)0xFD,(char)0x02,(char)0x7C //460800
					     ,(char)0x20,(char)0xFF,(char)0xF2,(char)0x02,(char)0x11 //115200
					     };

UCHAR yaya[100] ={(char)0x3c,(char)0x69,(char)0x3c,(char)0x70,(char)0x00,(char)0x09,(char)0x11 //[0]-[6]
			,(char)0xE9,(char)0xE1							      //[7]-[8]
			,(char)0x1C,(char)0x64,(char)0x6F,(char)0x77,(char)0x6E,(char)0x6C,(char)0x6F //[9]-[15]
			,(char)0x61,(char)0x64,(char)0x20,(char)0x69,(char)0x64,(char)0x65,(char)0x6E //[16]-[22]
			,(char)0x74,(char)0x69,(char)0x66,(char)0x69,(char)0x63,(char)0x61,(char)0x74 //[23]-[29]
			,(char)0x69,(char)0x6F,(char)0x6E,(char)0x20,(char)0x61,(char)0x72,(char)0x65,(char)0x61}; //[30]-[37]
	////////////////////350 355 639 9A9C 855 859 UART1///////////////////////////
	/////////////////////////////////////////////////////////////////////////////
	UCHAR mj[100]   ={(char)0x44,(char)0xc7,(char)0x00,(char)0x56,(char)0x00,(char)0x06
		    ,(char)0x40,(char)0x07,(char)0x80,(char)0x00,(char)0x03,(char)0xff
		    ,(char)0xff,(char)0x80,(char)0x03,(char)0x40
			,(char)0xE0												//E0[16]
			,(char)0x00,(char)0xFF,(char)0xF9,(char)0x01,(char)0xF8 //5 [17~~21]
			,(char)0xe9												//e9 [22]
			,(char)0xe1												//e1 [23]
			,(char)0x1c,(char)0x64,(char)0x6f,(char)0x77,(char)0x6e,(char)0x6c //[24]
			,(char)0x6F,(char)0x61,(char)0x64,(char)0x20,(char)0x69,(char)0x64
			,(char)0x65,(char)0x6E,(char)0x74,(char)0x69,(char)0x66,(char)0x69
			,(char)0x63,(char)0x61,(char)0x74,(char)0x69,(char)0x6F,(char)0x6E
			,(char)0x20,(char)0x61,(char)0x72,(char)0x65,(char)0x61};   //[52]   29S
	/////////////////530  535 UART0//////////////////////////////////////////
	////////////////////////////////////////////////////////////////////////////
	UCHAR Block8M00[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x02
			   ,(char)0x00,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block8M23[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x02
			   ,(char)0x23,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block8M24[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x02 //535
			   ,(char)0x24,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block8M25[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x02
			   ,(char)0x25,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block8M56[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x02
			   ,(char)0x56,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block80M00[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block80M24[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x00
			   ,(char)0x24,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block80M56[20] ={(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x00
			   ,(char)0x56,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block8M3b[20] = {(char)0xea,(char)0x00,(char)0x01,(char)0x00,(char)0x00,(char)0x00
			   ,(char)0x3b,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x01,(char)0x00,(char)0x00};	//数据大小
	/****************************8M 8M 8M 8M********************************************/
	UCHAR Block16M00[20] ={(char)0xea,(char)0x00,(char)0x02,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x00,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x02,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block16M36[20] ={(char)0xea,(char)0x00,(char)0x02,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x36,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x02,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block16M74[20] ={(char)0xea,(char)0x00,(char)0x02,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x74,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x02,(char)0x00,(char)0x00};	//数据大小
	UCHAR Block16M76[20] ={(char)0xea,(char)0x00,(char)0x02,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x76,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x02,(char)0x00,(char)0x00};	//数据大小
	
/******************************************************************************************/
	UCHAR Block32M78[20] ={(char)0xea,(char)0x00,(char)0x02,(char)0x00,(char)0x00
			   ,(char)0x00,(char)0x78,(char)0x00,(char)0x00			//地址
			   ,(char)0x00,(char)0x02,(char)0x00,(char)0x00};	//数据大小	
	/**********************************16M 16M 16M 16M********************************/   
	
	/**********************************16M 16M 16M 16M*********************************/
	UCHAR TurnOff[20] ={(char)0xe8};//***************关机指令////////////
//////////////////////////////////////////////////////////////////////
//工作者线程,负责监视串行口
//CComDebugDlg sjj_mj;
UINT CommProcThread(LPVOID pParam)
{
	OVERLAPPED os;
	DWORD dwMask, dwTrans;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	
	CSerialPort *pSerialPort = (CSerialPort *)pParam;
	memset(&os, 0, sizeof(OVERLAPPED));
	os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	
	if(os.hEvent == NULL)
	{
		return (UINT)-1;
	}
	
	while(pSerialPort->m_bMonitoring)
	{
		ClearCommError(pSerialPort->m_hCom, &dwErrorFlags, &ComStat);
		
		if(ComStat.cbInQue)
		{
			WaitForSingleObject(pSerialPort->m_hCanReadEvent, INFINITE);
			ResetEvent(pSerialPort->m_hCanReadEvent);

			pSerialPort->RecvChar();

			continue;
		}
		
		dwMask = 0;
		
		if(!WaitCommEvent(pSerialPort->m_hCom, &dwMask, &os)) // 重叠操作
		{
			if(GetLastError() == ERROR_IO_PENDING)
			{//无限等待重叠操作结果
				GetOverlappedResult(pSerialPort->m_hCom, &os, &dwTrans, TRUE);
			}
			else
			{
				CloseHandle(os.hEvent);

				return (UINT)-1;
			}
		}
	}
	
	CloseHandle(os.hEvent);
	
	return 0;
}

CSerialPort::CSerialPort()
{
	m_hCom = NULL;
	m_bInitComOk = FALSE;
	m_bMonitoring = FALSE;
	m_pThread = NULL;
	m_nBaudRate = 9600;
	m_nByteSize = 8;
	m_nFlowCtrl = 0;
	m_nParity = 0;
	m_szPort = "COM1";
	m_nStopBits = 0;

	InitializeCriticalSection(&m_csComSync);

	//创建可读数据事件对象,手工重置,初始化为有信号的
	if((m_hCanReadEvent = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL)
	{
		return;
	}
	
	memset(&m_osRead, 0, sizeof(OVERLAPPED));
	memset(&m_osWrite, 0, sizeof(OVERLAPPED));
	
	//为重叠读创建事件对象,手工重置,初始化为无信号的
	if((m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
	{
		return;
	}
	
	//为重叠写创建事件对象,手工重置,初始化为无信号的
	if((m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
	{
		return;
	}
}

CSerialPort::~CSerialPort()
{
	CloseCom();
	
	DeleteCriticalSection(&m_csComSync);
	// 删除事件句柄
	if(NULL != m_hCanReadEvent)
	{
		CloseHandle(m_hCanReadEvent);
	}
	
	if(NULL != m_osRead.hEvent)
	{
		CloseHandle(m_osRead.hEvent);
	}
	
	if(NULL != m_osWrite.hEvent)
	{
		CloseHandle(m_osWrite.hEvent);
	}

	m_CharList.RemoveAll();
}

/********************************************************************/
/**	功能:	初始化串口												*/
/**	参数:															*/
/**		nComPort--	串口号(1、2、3...)								*/
/**		nBaudRate--	波特率											*/
/**		nByteSize--	数据位											*/
/**		nStopBits--	停止位											*/
/**		nParity--	校检方式										*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::InitComPort(	const int nComPort,
								const int nBaudRate,
								const int nByteSize,
								const int nStopBits,
								const int nParity
							 )
{
	COMMTIMEOUTS TimeOuts;

	m_nBaudRate = nBaudRate;
	m_nByteSize = nByteSize;
	m_nStopBits = nStopBits;
	m_nParity = nParity;
	m_szPort.Format(_T("\\\\.\\COM%d"), nComPort);

	CloseCom();

	m_bInitComOk = FALSE;
	m_hCom = CreateFile(m_szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); // 重叠方式

	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("FALSE");
		return FALSE;
	}

	
	SetCommMask(m_hCom, EV_RXCHAR);
	

	// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
	TimeOuts.ReadIntervalTimeout = MAXDWORD; 
	TimeOuts.ReadTotalTimeoutMultiplier = 0; 
	TimeOuts.ReadTotalTimeoutConstant = 0; 

	//设置写超时以指定WriteCom成员函数中的
	//GetOverlappedResult函数的等待时间
	TimeOuts.WriteTotalTimeoutMultiplier = 0;
	TimeOuts.WriteTotalTimeoutConstant = 0;
	SetCommTimeouts(m_hCom, &TimeOuts);
	SetupComm(m_hCom, 13107, 13107);
	
	if(!ConfigCom())
	{
		AfxMessageBox("aa");
		CloseHandle(m_hCom);
		
		return FALSE;
	}
	
	m_bInitComOk = TRUE;

	

	return TRUE;
}
	
/********************************************************************/
/**	功能:	重新设置通讯方式										*/
/**	参数:															*/
/**		nBaudRate--	波特率											*/
/**		nByteSize--	数据位											*/
/**		nStopBits--	停止位											*/
/**		nParity--	校检方式										*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::ResetComPort(	const int nBaudRate,
								const int nByteSize,
								const int nStopBits,
								const int nParity
								)
{
	if(!m_bInitComOk)
	{
		return FALSE;
	}

	m_nBaudRate = nBaudRate;
	m_nByteSize = nByteSize;
	m_nStopBits = nStopBits;
	m_nParity = nParity;

	if(!ConfigCom())
	{
		m_bInitComOk = FALSE;
		CloseHandle(m_hCom);
		
		return FALSE;
	}

	return TRUE;
}

/********************************************************************/
/**	功能:	从串口输入缓冲区读入一个字符							*/
/**	参数:															*/
/**		ch--读到的字符												*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::ReadCom(char &chIn)
{
	if(!m_bInitComOk)
	{
		return FALSE;
	}

	if(m_CharList.GetCount() < 1)
	{
		return FALSE;
	}

	EnterCriticalSection(&m_csComSync);
	chIn = m_CharList.GetHead();

	m_CharList.RemoveHead();
	LeaveCriticalSection(&m_csComSync);

	return TRUE;
}

/********************************************************************/
/**	功能:	从串口输入缓冲区读入一个字符							*/
/**	参数:															*/
/**		ch--读到的字符												*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::ReadCom(unsigned char &chIn)
{
	char chRead = 0;

	if(!ReadCom(chRead))
	{
		return FALSE;
	}

	chIn = chRead;

	return TRUE;
}

/********************************************************************/
/**	功能:	从串口输入缓冲区读取指定长度的字符						*/
/**	参数:															*/
/**		pszBuff--读到的字符串										*/
/**	返回值:															*/
/**		DWORD类型--长度												*/
/********************************************************************/
DWORD CSerialPort::ReadCom(char *pszBuff, DWORD dwLength)
{
	if(!m_bInitComOk)
	{

⌨️ 快捷键说明

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