?? serialport.cpp
字號:
// SerialPort.cpp: implementation of the CSerialPort class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SerialPort.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSerialPort::CSerialPort()
{
m_hComm = INVALID_HANDLE_VALUE;
m_dwBaudRate = CBR_9600;
}
CSerialPort::~CSerialPort()
{
if (m_hComm != INVALID_HANDLE_VALUE)
Close();
}
void CSerialPort::Open(UINT nPort /*=1*/)
{
CString strPort;
strPort.Format("COM%d", nPort);
m_hComm = CreateFile(strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hComm == INVALID_HANDLE_VALUE)
{
CString strText;
strText.Format("打不開串行口(COM%d)!\r\n請檢查!", nPort);
MessageBox(NULL, strText, "錯誤", MB_SYSTEMMODAL | MB_ICONERROR);
return;
}
// Get any early notifications.
SetCommMask(m_hComm, EV_RXCHAR);
// Setup device buffers.
SetupComm(m_hComm, 1024, 1024);
// Purge any information in the buffer.
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
COMMTIMEOUTS commtimeouts;
commtimeouts.ReadIntervalTimeout = 0xFFFFFFFF; // 兩字符之間最大的延時,當讀取串口數據時,一旦兩個字符傳輸的時間差超過該時間,讀取函數將返回現有的數據。設置為0表示該參數不起作用。
commtimeouts.ReadTotalTimeoutMultiplier = 50; // 讀取每字符間的超時。
commtimeouts.ReadTotalTimeoutConstant = 1000; // 一次讀取串口數據的固定超時。所以在一次讀取串口的操作中,其超時為ReadTotalTimeoutMultiplier乘以讀取的字節數再加上 ReadTotalTimeoutConstant。
// 將ReadIntervalTimeout設置為MAXDWORD,并將ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant設置為0,表示讀取操作將立即返回存放在輸入緩沖區的字符。
// CBR_9600 is approximately 1byte/ms. For our purposes, allow
// double the expected time per character for a fudge factor.
commtimeouts.WriteTotalTimeoutMultiplier= 2*CBR_9600/m_dwBaudRate;
// 寫入每字符間的超時。
commtimeouts.WriteTotalTimeoutConstant = 0; // 一次寫入串口數據的固定超時。所以在一次寫入串口的操作中,其超時為WriteTotalTimeoutMultiplier乘以寫入的字節數再加上WriteTotalTimeoutConstant。
SetCommTimeouts(m_hComm, &commtimeouts);
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb);
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = FALSE;
dcb.fDsrSensitivity = FALSE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = DTR_CONTROL_DISABLE;
dcb.fInX=dcb.fOutX = FALSE;
dcb.fParity = TRUE;
dcb.fAbortOnError = TRUE;
dcb.XonChar = 0x11;
dcb.XoffChar = 0x13;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
SetCommState(m_hComm, &dcb);
}
void CSerialPort::Close()
{
if(m_hComm == INVALID_HANDLE_VALUE)
return;
SetCommMask(m_hComm, 0);
// Purge any outstanding reads/writes and close device handle.
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
BOOL CSerialPort::IsOpen() const
{
return (m_hComm != INVALID_HANDLE_VALUE);
}
BOOL CSerialPort::Write(BYTE* pBuffer, DWORD dwLength)
{
if(m_hComm == INVALID_HANDLE_VALUE)
return FALSE;
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
DWORD dwBytesWritten;
if(!WriteFile(m_hComm, pBuffer, dwLength, &dwBytesWritten, NULL))
{
DWORD dwErrors;
COMSTAT comstat;
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
ClearCommError(m_hComm, &dwErrors, &comstat);
return FALSE;
}
return TRUE;
}
BOOL CSerialPort::Read(BYTE* pBuffer, DWORD dwLength)
{
if(m_hComm == INVALID_HANDLE_VALUE)
return FALSE;
DWORD dwBytesRead;
DWORD dwErrors;
COMSTAT constat;
ClearCommError(m_hComm, &dwErrors, &constat);
SetRTS();
if(!ReadFile(m_hComm, pBuffer, dwLength, &dwBytesRead, NULL))
{
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
ClearCommError(m_hComm, &dwErrors, &constat);
ClearRTS();
return FALSE;
}
ClearRTS();
return TRUE;
}
void CSerialPort::SetBaudRate(DWORD dwBaudRate)
{
if(m_hComm == INVALID_HANDLE_VALUE)
return;
if(m_dwBaudRate == dwBaudRate)
return;
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb);
dcb.BaudRate = dwBaudRate;
SetCommState(m_hComm, &dcb);
m_dwBaudRate = dwBaudRate;
}
void CSerialPort::SetParity(BYTE byParity)
{
if(m_hComm == INVALID_HANDLE_VALUE)
return;
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb);
dcb.Parity = byParity;
SetCommState(m_hComm, &dcb);
}
void CSerialPort::SetRTS()
{
EscapeCommFunction(m_hComm, SETRTS);
}
void CSerialPort::ClearRTS()
{
EscapeCommFunction(m_hComm, CLRRTS);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -