?? serialcomm.cpp
字號:
if (FALSE == ::GetCommConfig(m_hCOM, NULL, &dwCCSize))
return BOOL(FALSE);
LPCOMMCONFIG pCC = LPCOMMCONFIG(new BYTE[dwCCSize]);
if (NULL == pCC)
return BOOL(FALSE);
pCC->dwSize = dwCCSize;
pCC->wVersion = 0x200;
pCC->dcb.DCBlength = sizeof(DCB);
if (FALSE == ::GetCommConfig(m_hCOM, pCC, &dwCCSize))
{
delete[] LPBYTE(pCC);
return BOOL(FALSE);
}
//檢查CommConfigDialog顯示標志,防止重復啟動CommConfigDialog
if (FALSE == m_bShowCommConfigDialog)
{
BOOL bRet = FALSE;
m_bShowCommConfigDialog = TRUE;
if (FALSE != ::CommConfigDialog(m_atcCurCOM, NULL, pCC))
{
if (NULL != IsOpened())
{
::PurgeComm(m_hCOM, PURGE_RXABORT | PURGE_TXABORT);
bRet=::SetCommConfig(m_hCOM, pCC, dwCCSize);
bRet = SetCommState(&pCC->dcb);
delete[] LPBYTE(pCC);
::PurgeComm(m_hCOM, PURGE_TXCLEAR | PURGE_RXCLEAR);
}
}
m_bShowCommConfigDialog = FALSE;
return BOOL(bRet);
}
}
return BOOL(FALSE);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前的異步寫屬性
//<參數>
// bAsyncOutput: 異步寫屬性設置值
//<返回值> 無
void CSerialComm::SetAsyncOutput(BOOL bAsyncOutput)
{
#if !defined(SC_MSCOMOBJECT)
m_bAsyncOutput = bAsyncOutput;
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的異步寫屬性
//<參數> 無
//<返回值>
// 返回當前的異步寫屬性。
BOOL CSerialComm::GetAsyncOutput()
{
#if !defined(SC_MSCOMOBJECT)
return BOOL(m_bAsyncOutput);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//以單片機多機通訊模式向指定地址發送數據
//<參數>
// ucAddr: 指定地址
// pData: 指定待發數據
// lWriteSize: 指定待發數據長度
//<返回值>
// 返回正確寫出的字節數。出錯時返回值小于0。
long CSerialComm::WriteTo(BYTE ucAddr, LPVOID pData, long lWriteSize)
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM)
return long(-6);
COMSTAT stCOMStat;
DWORD dwErr = 0;
//如果入口參數無效則試圖返回輸入緩沖區中的數據長度
if (NULL == pData || 0 > lWriteSize)
{
if (FALSE == ::ClearCommError(m_hCOM, &dwErr, &stCOMStat))
return long(-7);
return long(stCOMStat.cbOutQue);
}
m_stDCB.Parity = MARKPARITY;
m_stDCB.fParity = TRUE;
::SetCommState(m_hCOM, &m_stDCB);
BOOL bAsyncOutput = m_bAsyncOutput;
m_bAsyncOutput = FALSE;
long lWrited = Write(&ucAddr, sizeof(BYTE));
if (sizeof(BYTE) != lWrited)
{
m_bAsyncOutput = bAsyncOutput;
m_stDCB.Parity = SPACEPARITY;
::SetCommState(m_hCOM, &m_stDCB);
if (lWrited < 0)
return long(lWrited);
return long(-8);
}
m_bAsyncOutput = bAsyncOutput;
m_stDCB.Parity = SPACEPARITY;
::SetCommState(m_hCOM, &m_stDCB);
return long(Write(pData, lWriteSize));
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//在當前串行通訊端口等待接收第九位為'1'的地址數據
//<參數>
// pucAddr: 指定用于接收地址數據的緩沖區
//<返回值>
// 如果成功返回TRUE,否則返回FALSE。
// 注: 該方法一般用于與單片機進行通訊,數據第九位為'0',地址第九位為'1'。通訊
//時,校驗方式設置為空校驗方式以保證發送的數據數據第九位為'0'。
BOOL CSerialComm::ScanAddr(LPBYTE pucAddr)
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM || NULL == pucAddr)
return BOOL(FALSE);
if (sizeof(BYTE) != Read(pucAddr, sizeof(BYTE)))
return BOOL(FALSE);
DWORD dwError = 0;
COMSTAT stCOMStat;
if (FALSE == ::ClearCommError(m_hCOM, &dwError, &stCOMStat))
return BOOL(FALSE);
//由于處于空校驗方式,如果出現接收校驗錯誤即表示收到了第九位為'1'的數據。
if (FALSE == BOOL(dwError & CE_RXPARITY))
{
if (0 < stCOMStat.cbInQue)
{
LPBYTE pBuff = new BYTE[stCOMStat.cbInQue];
Read(pBuff, stCOMStat.cbInQue);
delete[] pBuff;
}
return BOOL(FALSE);
}
return BOOL(TRUE);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前串行通訊端口的DCB參數
//<參數>
// pDCB: 指定DCB數據
//<返回值>
// 如果成功則返回TRUE,否則返回FALSE。
BOOL CSerialComm::SetCommState(DCB *pDCB)
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM || NULL == pDCB)
return BOOL(FALSE);
::PurgeComm(m_hCOM, PURGE_RXABORT | PURGE_TXABORT);
if (FALSE == ::SetCommState(m_hCOM, pDCB))
return BOOL(FALSE);
::memcpy(&m_stDCB, pDCB, sizeof(DCB));
::PurgeComm(m_hCOM, PURGE_TXCLEAR | PURGE_RXCLEAR);
if (FALSE != ::GetCommTimeouts(m_hCOM, &m_stCTO))
{
int iBits = 1 + m_stDCB.ByteSize + ((m_stDCB.StopBits == ONESTOPBIT) ? 1 : 2);
m_stCTO.ReadIntervalTimeout = 10; //10ms的區間超時
m_stCTO.ReadTotalTimeoutMultiplier = (iBits * 1000) / m_stDCB.BaudRate; //傳輸一個字節所需的時間
if (0 == m_stCTO.ReadTotalTimeoutMultiplier)
m_stCTO.ReadTotalTimeoutMultiplier = 1;
m_stCTO.ReadTotalTimeoutConstant = m_stCTO.ReadTotalTimeoutMultiplier * 10;
m_stCTO.WriteTotalTimeoutMultiplier = ((iBits + 2) * 1000) / m_stDCB.BaudRate; //傳輸一個字節所需的時間
if (0 == m_stCTO.WriteTotalTimeoutMultiplier)
m_stCTO.WriteTotalTimeoutMultiplier = 1;
m_stCTO.WriteTotalTimeoutConstant = m_stCTO.WriteTotalTimeoutMultiplier * 10;
::SetCommTimeouts(m_hCOM, &m_stCTO);
}
return BOOL(TRUE);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的DCB鏡像
//<參數>
// pDCB: 指向一個用于接收DCB數據的緩沖區
//<返回值>
// 如果成功返回TRUE,否則返回FALSE。
BOOL CSerialComm::GetCommState(DCB *pDCB)
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM || NULL == pDCB)
return BOOL(FALSE);
if (FALSE == ::GetCommState(m_hCOM, pDCB))
return BOOL(FALSE);
::memcpy(&m_stDCB, pDCB, sizeof(DCB));
return BOOL(TRUE);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前的波特率屬性
//<參數>
// dwBaudrate: 波特率屬性設置值
//<返回值> 無
void CSerialComm::SetBaudrate(DWORD dwBaudrate)
{
#if !defined(SC_MSCOMOBJECT)
m_stDCB.BaudRate = FormatBaudrate(dwBaudrate);
SetCommState(&m_stDCB);
if (FALSE != ::GetCommTimeouts(m_hCOM, &m_stCTO))
{
int iBits = 1 + m_stDCB.ByteSize + ((m_stDCB.StopBits == ONESTOPBIT) ? 1 : 2);
m_stCTO.ReadIntervalTimeout = 10; //10ms的區間超時
m_stCTO.ReadTotalTimeoutMultiplier = (iBits * 1000) / m_stDCB.BaudRate; //傳輸一個字節所需的時間
if (0 == m_stCTO.ReadTotalTimeoutMultiplier)
m_stCTO.ReadTotalTimeoutMultiplier = 1;
m_stCTO.ReadTotalTimeoutConstant = m_stCTO.ReadTotalTimeoutMultiplier * 10;
m_stCTO.WriteTotalTimeoutMultiplier = ((iBits + 2) * 1000) / m_stDCB.BaudRate; //傳輸一個字節所需的時間
if (0 == m_stCTO.WriteTotalTimeoutMultiplier)
m_stCTO.WriteTotalTimeoutMultiplier = 1;
m_stCTO.WriteTotalTimeoutConstant = m_stCTO.WriteTotalTimeoutMultiplier * 10;
::SetCommTimeouts(m_hCOM, &m_stCTO);
}
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的波特率屬性
//<參數> 無
//<返回值>
// 返回當前的波特率屬性。
DWORD CSerialComm::GetBaudrate()
{
#if !defined(SC_MSCOMOBJECT)
return DWORD(m_stDCB.BaudRate);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前的數據位數屬性
//<參數>
// ucSize: 數據位數屬性設置值
//<返回值> 無
void CSerialComm::SetByteSize(BYTE ucSize)
{
#if !defined(SC_MSCOMOBJECT)
BYTE ucOldSet = m_stDCB.ByteSize;
m_stDCB.ByteSize = ucSize;
if (FALSE == SetCommState(&m_stDCB))
{
m_stDCB.ByteSize = ucOldSet;
}
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的數據位數屬性
//<參數> 無
//<返回值>
// 返回當前的數據位數屬性。
BYTE CSerialComm::GetByteSize()
{
#if !defined(SC_MSCOMOBJECT)
return BYTE(m_stDCB.ByteSize);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前的校驗方式屬性
//<參數>
// ucParity: 校驗方式屬性設置值
//<返回值> 無
void CSerialComm::SetParity(BYTE ucParity)
{
#if !defined(SC_MSCOMOBJECT)
m_stDCB.Parity = FormatParity(ucParity);
SetCommState(&m_stDCB);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的校驗方式屬性
//<參數> 無
//<返回值>
// 返回當前的校驗方式屬性。
BYTE CSerialComm::GetParity()
{
#if !defined(SC_MSCOMOBJECT)
return BYTE(m_stDCB.Parity);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//設置當前的停止位數屬性
//<參數>
// ucStopBits: 停止位數屬性設置值
//<返回值> 無
void CSerialComm::SetStopBits(BYTE ucStopBits)
{
#if !defined(SC_MSCOMOBJECT)
BYTE ucOldSet = m_stDCB.StopBits;
m_stDCB.StopBits = ucStopBits;
if (FALSE == SetCommState(&m_stDCB))
{
m_stDCB.StopBits = ucOldSet;
}
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
//獲取當前的停止位數屬性
//<參數> 無
//<返回值>
// 返回當前的停止位數屬性。
BYTE CSerialComm::GetStopBits()
{
#if !defined(SC_MSCOMOBJECT)
return BYTE(m_stDCB.StopBits);
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
void CSerialComm::ClearReadBuffer()
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE != m_hCOM || NULL != m_hCOM)
{
::PurgeComm(m_hCOM, PURGE_RXCLEAR);
}
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
void CSerialComm::ClearWriteBuffer()
{
#if !defined(SC_MSCOMOBJECT)
if (INVALID_HANDLE_VALUE != m_hCOM || NULL != m_hCOM)
{
::PurgeComm(m_hCOM, PURGE_TXCLEAR);
}
#else //if !defined(SC_MSCOMOBJECT)
#endif
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -