📄 serial.cpp
字号:
//济南海硕科技有限公司目前拥有一套具有自主知识产权的,既可以面向终端用户,也可以面向二次开发用户的嵌入式应用平台。
//对于终端用户,海硕公司可以根据用户的需求,为其量身定做WinCE下的应用软件。
//对于二次开发用户,海硕公司可以提供最大程度上的技术支持。
//另外海硕公司还对外承接项目工程。
//联系电话:15106930064 15866616892
//传 真:(0531)86300038
//网 址:www.handshow.net
//技术论坛:www.handshow.net/bbs
#include "StdAfx.h"
#include "serial.h"
// CSerial
CSerial::CSerial():
m_hCom(INVALID_HANDLE_VALUE)
{
OpenCom();
}
CSerial::~CSerial()
{
CloseCom();
}
// CSerial 成员函数
//串口操作区
//====================================================================================
//打开串口
BOOL CSerial::OpenCom()
{
m_hCom = CreateFile(_T("COM2:") , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , NULL);
if(INVALID_HANDLE_VALUE == m_hCom)
{
CString strError;
strError.Format(_T("打开串口错误,错误编号为:%d"),GetLastError());
MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
return FALSE;
}
//如果初始化串口失败,返回FALSE。
if(!InitCom())
{
return FALSE;
}
return TRUE;
}
//关闭串口
void CSerial::CloseCom()
{
EscapeCommFunction(m_hCom , CLRDTR);
EscapeCommFunction(m_hCom , CLRRTS);
PurgeComm(m_hCom , PURGE_TXCLEAR | PURGE_RXCLEAR);
if(INVALID_HANDLE_VALUE != m_hCom)
{
CloseHandle(m_hCom);
m_hCom = INVALID_HANDLE_VALUE;
}
}
//初始化串口
BOOL CSerial::InitCom()
{
//设置端口监测事件
//SetCommMask(m_hCom , EV_RXCHAR);
//分配端口缓冲区
SetupComm(m_hCom , (COMBUFSIZE<<1) , (COMBUFSIZE<<1));
//初始化缓冲区中的信息
PurgeComm(m_hCom , PURGE_RXCLEAR);
//设定DCB
DCB ComDCB;
ComDCB.DCBlength = sizeof(DCB);
GetCommState(m_hCom , &ComDCB);
ComDCB.Parity = NOPARITY;
ComDCB.BaudRate = 9600;
ComDCB.ByteSize = 8;
ComDCB.StopBits = ONESTOPBIT;
if(!SetCommState(m_hCom , &ComDCB))
{
CString strError;
strError.Format(_T("设置DCB失败,错误编号为:%d"),GetLastError());
MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
return FALSE;
}
//设定DCB结束
//设定设备超时
COMMTIMEOUTS ComTimeOuts;
GetCommTimeouts(m_hCom , &ComTimeOuts);
//当设置ReadIntervalTimeout为MAXDWORD
ComTimeOuts.ReadIntervalTimeout = MAXDWORD;
//设置ReadTotalTimeoutConstant为0
ComTimeOuts.ReadTotalTimeoutConstant = 100;
//设置ReadTotalTimeoutMultiplier为0时,表示读取操作将立即返回存放在输入缓冲区的字符。
ComTimeOuts.ReadTotalTimeoutMultiplier = 1;
ComTimeOuts.WriteTotalTimeoutConstant = 10;
ComTimeOuts.WriteTotalTimeoutMultiplier = 10;
if(!SetCommTimeouts(m_hCom , &ComTimeOuts))
{
CString strError;
strError.Format(_T("设置超时失败,错误编号为:%d"),GetLastError());
MessageBox(0 , strError , _T("错误") , MB_OK | MB_ICONERROR);
return FALSE;
}
EscapeCommFunction (m_hCom, SETDTR);
EscapeCommFunction (m_hCom, SETRTS);
return TRUE;
}
//向串口发送命令
BOOL CSerial::WriteCommand(BOOL bCtrlFlag)
{
BOOL bWriteState;
DWORD dwBytesWritten;
UCHAR arrCmd[] = {0xAA, (UCHAR)bCtrlFlag, 0x55};
bWriteState = WriteFile(m_hCom , arrCmd , 3 , &dwBytesWritten , NULL);
if((!bWriteState) || (3 != dwBytesWritten))
{
MessageBox(0 , _T("不能够将数据写入串口") , _T("错误") , MB_OK | MB_ICONERROR);
return FALSE;
}
return bWriteState;
}
BOOL CSerial::WriteCommand(UCHAR* pData)
{
BOOL bWriteState;
DWORD dwBytesWritten;
UCHAR arrCmd[] = {0xAA, pData[0], pData[1], pData[2], pData[3], pData[4], pData[5], pData[6], pData[7], 0x55};
bWriteState = WriteFile(m_hCom , arrCmd , 10 , &dwBytesWritten , NULL);
if((!bWriteState) || (10 != dwBytesWritten))
{
MessageBox(0 , _T("不能够将数据写入串口") , _T("错误") , MB_OK | MB_ICONERROR);
return FALSE;
}
return bWriteState;
}
BOOL CSerial::ReadDataFromSerial()
{.
BOOL bReadState;
DWORD dwErrorFlags;
COMSTAT ComStat;
DWORD dwDataLen;
DWORD dwReadLen;
////设置下一状态为发送命令状态
ClearCommError(m_hCom , &dwErrorFlags , &ComStat);
//cbInQue中传回的是缓冲区中数据的字节数
dwDataLen = ComStat.cbInQue;
//读数据
bReadState = ReadFile(m_hCom , m_arrDataBuf , 10 , &dwReadLen , NULL);
ClearCommError(m_hCom , &dwErrorFlags , &ComStat);
dwDataLen = ComStat.cbInQue;
//如果读取成功则进行数据处理
if(bReadState)
{
if((0xaa==m_arrDataBuf[0]) && (0x55==m_arrDataBuf[9]))
{
for(BYTE i=1; i<9; i++)
{
TRACE(TEXT("返回的数值为:%d\n"), m_arrDataBuf[i]);
}
return TRUE;
}
}
return FALSE;
}
void CSerial::AnalyzeReturnData(BOOL& bTurnOn, BOOL& bBtnDown)
{
bTurnOn = FALSE;
bBtnDown = FALSE;
if(1 == m_arrDataBuf[1])
{
bTurnOn = TRUE;
}
if(1 == m_arrDataBuf[2])
{
bBtnDown = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -