📄 serial.cpp
字号:
/*! \file CSerial.cpp
\brief CSerial类实现文件
\author 陈华毅
\version 1.0
这个类完成处理串口操作。通过 \a OpenComm()读取打开串口;
通过\a CloseComm()从关闭串口。
\defgroup CSERIAL_IMPLEMENT CSerial类实现说明
*/
#include "stdafx.h"
#include "GPRS.h"
#include "Serial.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//@{Group: CSERIAL_IMPLEMENT
CSerial::CSerial()
{
}
CSerial::~CSerial()
{
}
DWORD CSerial::InitDCB()
{
DCB dcb;
dcb.fBinary = TRUE; /* Win32不支持非二进制串行传输模式,必须为TRUE */
dcb.fParity = FALSE; /* 不启用奇偶校验 */
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
/* 控制位 */
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutX = FALSE; /* 设为TRUE指定XON/XOFF控制被用于控制串行输出 */
dcb.fInX = FALSE; /* 设为TRUE指定XON/XOFF控制被用于控制串行输入 */
/* XON/XOFF流控制设置 */
dcb.fInX=dcb.fOutX = FALSE;
dcb.XonChar = 0x11;
dcb.XoffChar = 0x13;
dcb.XonLim = 500;
dcb.XoffLim = 500;
return SetCommState(m_hFile,&dcb);
}
DWORD CSerial::ReadComm(BYTE *pData, DWORD dwLength)
{
DWORD length=0;
DWORD dwRealRead=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL Status;
/* 检测串口缓存内数据 */
ClearCommError(m_hFile,&dwErrorFlags,&ComStat);
length = min(dwLength, ComStat.cbInQue);
Status = ReadFile(m_hFile, pData, length, &dwRealRead, NULL);
if(Status == FALSE)
{
DWORD error;
MessageBox(NULL,TEXT("Read file failed"),NULL, MB_OK);
error = GetLastError();
/* 超时退出 */
if(error == ERROR_TIMEOUT)
{
return dwRealRead;
}
}
return dwRealRead;
}
BOOL CSerial::CloseComm()
{
if (m_hFile)
{
/* 结束线程中WaitCommEvent的等待 */
SetCommMask(m_hFile, 0);
/* 清除端口上指定信号的状态 */
EscapeCommFunction(m_hFile, CLRDTR);
EscapeCommFunction(m_hFile, CLRRTS);
/* 清除驱动程序内部的发送和接收队列 */
PurgeComm(m_hFile, PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
return TRUE;
} else{
::MessageBox(NULL, TEXT("Close Comm Failed!"), NULL, MB_OK);
return FALSE;
}
}
BOOL CSerial::OpenComm()
{
COMMTIMEOUTS TimeOuts;
CString str ;
m_hFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == m_hFile)
{
MessageBox(NULL, TEXT("OpenComm failed"), NULL, MB_OK);
str.Format(TEXT("%d"),GetLastError());
MessageBox(NULL, str, NULL, MB_OK) ;
}
/* 设置串口接收和发送缓冲大小 */
if (!SetupComm(m_hFile, 1024, 1024))
{
MessageBox(NULL,TEXT("SetupComm failed\r\n"), NULL, MB_OK);
return FALSE;
}
/* 设置事件和超时时间 */
if(!SetCommMask(m_hFile, EV_RXCHAR))
{
MessageBox(NULL, TEXT("SetupCommMask failed\r\n"), NULL, MB_OK);
return FALSE;
}
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0;
TimeOuts.WriteTotalTimeoutMultiplier = 100;
TimeOuts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hFile,&TimeOuts);
if (!InitDCB())
{
MessageBox(NULL, TEXT("config comm failed"), NULL, MB_OK);
}
return TRUE;
}
DWORD CSerial::WriteComm(BYTE *pData, DWORD dwLength)
{
BOOL fState;
DWORD length = dwLength;
DWORD dwRealWrite;
DWORD dwErrorFlags;
ClearCommError(m_hFile, &dwErrorFlags, NULL);
fState = WriteFile(m_hFile, pData, length, &dwRealWrite, NULL);
if(FALSE == fState)
{
MessageBox(NULL, TEXT("Write comm failed"), NULL, MB_OK);
dwRealWrite = 0;
}
return dwRealWrite;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -