📄 serial.cpp
字号:
# include "stdafx.h"
# include "serial.h"
CSerial::CSerial():m_hPort(INVALID_HANDLE_VALUE)
{
// static int nCount(0);
// ++nCount;
// ASSERT( nCount == 1);
}
CSerial::~CSerial()
{
Close();
}
void CSerial::Close()
{
if(m_hPort != INVALID_HANDLE_VALUE)
ClosePort(m_hPort);
m_hPort = INVALID_HANDLE_VALUE;
}
BOOL CSerial::IsOpen()
{
return (m_hPort != INVALID_HANDLE_VALUE)?TRUE:FALSE;
}
BOOL CSerial::OpenPort(int nCOM, int BaudRate )
{
if(m_hPort!=INVALID_HANDLE_VALUE)
return FALSE;
char *strCOM[]={ "COM1", "COM2", "COM3", "COM4" };
m_hPort = CreateFile(strCOM[nCOM], // Specify port device: default "COM1"
GENERIC_READ | GENERIC_WRITE, // Specify mode that open device.
0, // the devide isn't shared.
NULL, // the object gets a default security.
OPEN_EXISTING, // Specify which action to take on file.
0, // default.
NULL); // default.
if( m_hPort == INVALID_HANDLE_VALUE )
return FALSE;
// Get current configuration of serial communication port.
DCB config_;
GetCommState(m_hPort,&config_);
// Assign user parameter.
config_.ByteSize = 8; // Byte of the Data.
config_.StopBits = ONESTOPBIT; // Use one bit for stopbit.
config_.Parity = NOPARITY; // No parity bit
config_.BaudRate = BaudRate;//CBR_9600; // Buadrate 9600 bit/sec
// Set current configuration of serial communication port.
if (SetCommState(m_hPort,&config_) == 0)
{
return FALSE;
}
// _co.ReadIntervalTimeout = 0xFFFFFFFF;
// _co.ReadTotalTimeoutMultiplier = 0;
// _co.ReadTotalTimeoutConstant = 0;
// _co.WriteTotalTimeoutMultiplier = 0;
// _co.WriteTotalTimeoutConstant = 5000;
// instance an object of COMMTIMEOUTS.
COMMTIMEOUTS comTimeOut;
// Specify time-out between charactor for receiving.
comTimeOut.ReadIntervalTimeout = 3;//0xffffffff;
// Specify value that is multiplied
// by the requested number of bytes to be read.
comTimeOut.ReadTotalTimeoutMultiplier = 3;//0;
// Specify value is added to the product of the
// ReadTotalTimeoutMultiplier member
comTimeOut.ReadTotalTimeoutConstant = 2;//0;
// Specify value that is multiplied
// by the requested number of bytes to be sent.
comTimeOut.WriteTotalTimeoutMultiplier = 3;//0;
// Specify value is added to the product of the
// WriteTotalTimeoutMultiplier member
comTimeOut.WriteTotalTimeoutConstant = 2;//5000;
// set the time-out parameter into device control.
SetCommTimeouts(m_hPort,&comTimeOut);
// Updata port's status.
SetupComm( m_hPort, 8192, 8192 ); //设置推荐缓冲区
//
PurgeComm( m_hPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清空串口缓冲区
return TRUE;
}
DWORD CSerial::ReadPort( TCHAR *buf )
{
if( m_hPort == INVALID_HANDLE_VALUE ) return 0;
BOOL fReadState;
DWORD dwLength(0);
/*
COMSTAT stat;
DWORD error;
if(ClearCommError(m_hPort, &error, &stat) && error > 0) //清除错误
{
PurgeComm(m_hPort, PURGE_RXABORT | PURGE_RXCLEAR); //清除输入缓冲区
return 0;
}
//*/
// OVERLAPPED _ro; // 重叠I/O
fReadState=ReadFile(m_hPort,buf,0x40,&dwLength,NULL);//&_ro);
if(!fReadState)
{//不能从串口读取数据
return 0;
}
else
{//把数据赋值给全局变量
if( dwLength > 0 )
buf[dwLength]=NULL;
return dwLength;
}
}
int CSerial::Send( TCHAR *buf )
{
return WritePort( buf, strlen(buf));
}
DWORD CSerial::WritePort(TCHAR *buf,DWORD dwCharToWrite)
{
if( m_hPort == INVALID_HANDLE_VALUE )
return 0;
// DWORD error;
// if(ClearCommError(m_hPort, &error, NULL) && error > 0) //清除错误
// PurgeComm(m_hPort, PURGE_TXABORT | PURGE_TXCLEAR);
BOOL fWriteState;
DWORD dwBytesWritten(dwCharToWrite);
//写入数据
//OVERLAPPED _wr; // 重叠I/O
fWriteState=WriteFile(m_hPort,buf,dwCharToWrite*sizeof(TCHAR),&dwBytesWritten, NULL);//&_wr);
if(!fWriteState)//不能写数据
dwBytesWritten=0;
return dwBytesWritten;
}
BOOL CSerial::ClosePort(HANDLE & hCommPort)
{
if (hCommPort != INVALID_HANDLE_VALUE)
{
//设置连接属性为FALSE
CloseHandle (hCommPort);
hCommPort = INVALID_HANDLE_VALUE;
return TRUE;
}
else
{
return TRUE;
}
}
void CSerial::ClearBuffer()
{
char buf[0x40];
memset( buf, NULL, 0x40);
while( ReadPort(buf) > 0 );
}
int CSerial::Filter( char *buf, char *buffer, int nMax )
{//过滤有效字符
char c;
int k(0);
memset( buf, NULL, nMax );
for( int j(0); j<nMax; j++){
c = buffer[j];
if( (c >='0'&& c<='9' ) ||
( c >='A' && c <= 'z' ) || c == '-' || c == '.' || c == ',' )
{
buf[k++] = c;
}
else if( c == '\n' || c == '\r' )//结束符
{
}
else
break;
}
if(k)buf[k++]=0x0a;
buf[k]=NULL;
return k;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -