📄 serial1.cpp
字号:
// Serial1.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Serial.h"
#include "Serial1.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSerial::CSerial()
{
hCom=NULL;
}
CSerial::~CSerial()
{
}
HANDLE CSerial::OpenCommPort(LPSTR lpCom)
{
//打开串口
hCom=CreateFile( lpCom, GENERIC_READ | GENERIC_WRITE,/* 允许读写*/
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
ASSERT(hCom!=INVALID_HANDLE_VALUE);//检测打开串口操作是否成功
return hCom;
}
void CSerial::InitialCommPort()
{
memset(&m_ReadOverlapped,0,sizeof(OVERLAPPED));//使OVERLAPPED结构成员为0
memset(&m_WriteOverlapped,0,sizeof(OVERLAPPED));
m_WriteOverlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
m_ReadOverlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
//设置输入、输出缓冲区的大小
SetupComm( hCom, 4096,4096) ;
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR ); //清干净输入、输出缓冲区
//定义超时结构,并填写该结构
COMMTIMEOUTS TimeOuts ;
//把间隔超时设为最大,把总超时设为0,将导致ReadFile函数立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutConstant=2000;
TimeOuts.ReadTotalTimeoutMultiplier=0;
//设置写超时,以指定WriteComm成员函数中的GetOverlappedResult函数
TimeOuts.WriteTotalTimeoutConstant=2000;//2000
TimeOuts.WriteTotalTimeoutMultiplier=50;//50
SetCommTimeouts(hCom,&TimeOuts);
//设置串口的DCB
// DCB dcb;// 定义数据控制块结构
GetCommState(hCom,&dcb);
BuildCommDCB("9600,N,8,1",&dcb);
SetCommState(hCom,&dcb);
}
void CSerial::SetCommDCB(DCB *Commdcb)
{
GetCommState(hCom,&dcb);
dcb.BaudRate=Commdcb->BaudRate;
dcb.ByteSize=Commdcb->ByteSize;
dcb.Parity=Commdcb->Parity;
dcb.StopBits=Commdcb->StopBits;
SetCommState(hCom,&dcb);
}
BOOL CSerial::ReadComm(char *buffer, DWORD dwLength)
{
DWORD dwBytesRead=0;
// buffer=NULL;
if(!hCom)return 0;
dwBytesRead=dwLength;
int t=0;
if(dwBytesRead)
{
if(!(t=ReadFile(hCom,buffer,dwLength,&dwBytesRead,&m_ReadOverlapped)))
return 0;
}
return 1;
}
BOOL CSerial::WriteComm(char *buffer, DWORD dwLength)
{
int t;
DWORD dwBytesWrite=0;
if(!hCom)return 0;
if(!(t=WriteFile(hCom,buffer,dwLength,&dwBytesWrite,&m_WriteOverlapped)))return 0;
else
return 1;
}
void CSerial::CloseCommPort()
{
if(hCom)CloseHandle(hCom);
if(m_WriteOverlapped.hEvent)CloseHandle(m_WriteOverlapped.hEvent);
if(m_ReadOverlapped.hEvent)CloseHandle(m_ReadOverlapped.hEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -