📄 serialport.cpp
字号:
// 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 + -