comm.cpp
来自「手机开发环境BREW实例」· C++ 代码 · 共 320 行
CPP
320 行
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SMM4COM.h"
#include "Comm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComm::CComm()
{
m_hComDev = INVALID_HANDLE_VALUE;
m_dwError = 0;
}
CComm::~CComm()
{
if(IsOpened())Close();
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 得到当前已打开串口的相关信息。
//参数描述:
// 无
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortStateGet()
{
if(IsOpened())
{
m_dcbPort.DCBlength = sizeof(DCB);
return GetCommState(m_hComDev, &m_dcbPort);
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 设置串口相关参数信息。
//参数描述:
// 无
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortStateSet()
{
if(IsOpened())
{
return SetCommState(m_hComDev, &m_dcbPort);
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 得到当前已打开串口的超时信息。
//参数描述:
// 无
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortTimeoutsGet()
{
if(IsOpened())
{
return GetCommTimeouts(m_hComDev, &m_CommTimeOutsPort);
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 设置当前已打开串口的超时信息。
//参数描述:
// 无
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortTimeoutsSet()
{
if(IsOpened())
{
return SetCommTimeouts(m_hComDev, &m_CommTimeOutsPort);
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 设置当前已打开串口的输入、输出缓冲区尺寸。
//参数描述:
// 无
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortBufferSizeSet()
{
if(IsOpened())
{
return SetupComm(m_hComDev, m_sBufferSize.dwInput, m_sBufferSize.dwOutput);
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 清除错误,查询等待接收的字节数。
//参数描述:
// 无
//返回值描述:
// 等待接收的字节数。
//////////////////////////////////////////////////////////////////////
DWORD CComm::ReadDataWaiting()
{
if(!IsOpened())return 0;
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError(m_hComDev, &dwErrorFlags, &ComStat);
return ComStat.cbInQue;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
//打开指定的串口,并设置串口的通用性能。
//参数描述:
// iPort:输入,串口号。1表示COM1,2表示COM2,以此类推。
// iBaud:输入,波特率
// bByteSize:输入,数据位数
// bParity:输入,奇偶效验位
// bStopBit:输入,停止位
// dwfParity:输入,是否允许奇偶效验,1表示允许,0表示不允许
//返回值描述:
// TRUE:成功
// FALSE:失败
//备注:
// 如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
BOOL CComm::Open(int iPort, int iBaud,BYTE bByteSize,BYTE bParity,BYTE bStopBit,DWORD dwfParity)
{
if(!IsOpened())
{
char szPort[32];
wsprintf(szPort, "//./COM%d", iPort);
//以可读写的方式打开指定端口
m_hComDev = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hComDev == INVALID_HANDLE_VALUE)
return FALSE;
if(!(IsOpened() && PortStateGet() && PortTimeoutsGet()))
{
m_dwError = GetLastError();
return FALSE;
}
}
//超时时间设置
m_CommTimeOutsPort.ReadIntervalTimeout = MAXDWORD;
m_CommTimeOutsPort.ReadTotalTimeoutMultiplier = MAXDWORD;
m_CommTimeOutsPort.ReadTotalTimeoutConstant = TIME_WAIT_READ_MIN;
m_CommTimeOutsPort.WriteTotalTimeoutMultiplier = 20;
m_CommTimeOutsPort.WriteTotalTimeoutConstant = 2000;
//硬件参数设置
m_dcbPort.BaudRate = iBaud;
m_dcbPort.ByteSize = bByteSize;
m_dcbPort.Parity = bParity;
m_dcbPort.fParity = dwfParity;
m_dcbPort.StopBits = bStopBit;
//默认性能已调至最优,有修改请注明
m_dcbPort.fBinary = TRUE;
m_dcbPort.fOutxCtsFlow = FALSE;
m_dcbPort.fOutxDsrFlow = FALSE;
m_dcbPort.fDtrControl = DTR_CONTROL_ENABLE;
m_dcbPort.fDsrSensitivity = FALSE;
m_dcbPort.fOutX = FALSE;
m_dcbPort.fInX = FALSE;
m_dcbPort.fNull = FALSE;
m_dcbPort.fRtsControl = RTS_CONTROL_ENABLE;
m_dcbPort.fAbortOnError = FALSE;
//性能调节结束
m_sBufferSize.dwInput = DEFAULT_BUFFER_SIZE_INPUT;
m_sBufferSize.dwOutput = DEFAULT_BUFFER_SIZE_OUTPUT;
if(PortTimeoutsSet() && PortStateSet() && PortBufferSizeSet())
return TRUE;
m_dwError = GetLastError();
Close();
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 无条件关闭当前打开的串口。
//参数描述:
// 无
//返回值描述:
// 无
//////////////////////////////////////////////////////////////////////
void CComm::Close()
{
CloseHandle(m_hComDev);
m_hComDev = INVALID_HANDLE_VALUE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 向已打开的串口写入数据。
//参数描述:
// ucData:输入,写入的数据区指针。
// iSize:输入,写入的数据字节数。
//返回值描述:
// TRUE:成功。
// FALSE:失败.
//备注:
// 如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
BOOL CComm::SendData(const unsigned char * pszData, int iSize)
{
if(!IsOpened())return FALSE;
ReadDataWaiting();
DWORD dwBytesWritten = 0;
BOOL bWriteStatus = WriteFile(m_hComDev, pszData, iSize, &dwBytesWritten, NULL);
if(bWriteStatus && iSize == (int)dwBytesWritten)
{
return TRUE;
}
m_dwError = GetLastError();
return FALSE;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 读取接收的数据。
//参数描述:
// Data:输出,接收的数据区指针。
// iLimit:输入,接收的数据区长度。
//返回值描述:
// >=0:成功,返回接收成功的字节数。
// -1:失败.
//备注:
// 如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
int CComm::ReadData(void * pData, int iLimit)
{
if(!IsOpened())return -1;
ReadDataWaiting();
BOOL bReadStatus;
DWORD dwBytesRead;
int iCount = 0;
do
{
dwBytesRead = 0;
bReadStatus = ReadFile(m_hComDev, (char *)pData + iCount, iLimit - iCount, &dwBytesRead, NULL);
if(!bReadStatus)
{
m_dwError = GetLastError();
return -1;
}
iCount += (int)dwBytesRead;
}while(dwBytesRead);
return iCount;
}
//////////////////////////////////////////////////////////////////////
//功能描述:
// 设置基本通讯参数。
//参数描述:
// iBaudRate:输入,波特率。没有无效值保护。
// iDataBits:输入,数据位数,有效值4-8。
// bParityMode:输入,校验模式
// bStopBits:输入,停止数据位数
// dwfParity:输入,是否进行奇偶效验,1表示效验,0表示不效验
//返回值描述:
// TRUE:成功
// FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::SetupBase(int iBaudRate, int iDataBits, BYTE bParityMode, BYTE bStopBits,DWORD dwfParity)
{
if(IsOpened() && (iDataBits > 3 && iDataBits < 9))
{
m_dcbPort.BaudRate = iBaudRate;
m_dcbPort.ByteSize = iDataBits;
m_dcbPort.Parity = bParityMode;
m_dcbPort.fParity = dwfParity;
m_dcbPort.StopBits = bStopBits;
return PortStateSet();
}
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?