📄 com.cpp
字号:
// Com.cpp: implementation of the CCom class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "dongmo.h"
#include "Com.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
HANDLE m_hCom;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCom::CCom()
{
m_hCom = INVALID_HANDLE_VALUE;
m_csName[0] = 0;
}
CCom::~CCom()
{
Close();
}
bool CCom::Open(LPCTSTR lpszFileName, DWORD dwBaudRate)
{
/* m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(m_hCom==(HANDLE)-1)
{AfxMessageBox("此串口已打开");
// kai=0;
return 0;
}
else//配置串口参数
{DCB dcb;
GetCommState(m_hCom,&dcb);
dcb.BaudRate=CBR_9600;//调试暂时改变
dcb.fParity=0;//调试
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;//调试
SetCommState(m_hCom,&dcb);
COMMTIMEOUTS comm;//设置读写最长时间
comm.ReadIntervalTimeout=MAXDWORD;
comm.ReadTotalTimeoutConstant=0;
comm.ReadTotalTimeoutMultiplier=0;
comm.WriteTotalTimeoutConstant=1000;
comm.WriteTotalTimeoutMultiplier=0;
SetCommTimeouts(m_hCom,&comm);
PurgeComm(m_hCom,PURGE_TXCLEAR);//清除缓冲区
PurgeComm(m_hCom,PURGE_RXCLEAR);
}*/
if (strcmp(m_csName, lpszFileName))
{
HANDLE hTemp = CreateFile(lpszFileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
/* if (hTemp == INVALID_HANDLE_VALUE)
return false;*/
Close();
m_hCom = hTemp;
strcpy(m_csName, lpszFileName);
}
DCB dcb;
GetCommState(m_hCom, &dcb);
dcb.BaudRate = dwBaudRate;
dcb.ByteSize = 8;//8位字符码
dcb.Parity = EVENPARITY;//偶校验,
dcb.StopBits = ONESTOPBIT;//1位停止位,
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(m_hCom, &dcb);
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout =MAXDWORD;// 30000 / dwBaudRate + 3;
CommTimeOuts.ReadTotalTimeoutMultiplier =0;// 10000 / dwBaudRate + 1;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier =0;// 5;
CommTimeOuts.WriteTotalTimeoutConstant =1000;//0;
SetCommTimeouts(m_hCom, &CommTimeOuts);
SetupComm(m_hCom, 1024, 1024);
PurgeComm(m_hCom,
PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return true;
}
void CCom::Close()
{
if (m_hCom == INVALID_HANDLE_VALUE)
return;
CloseHandle(m_hCom);
m_hCom = INVALID_HANDLE_VALUE;
m_csName[0] = 0;
}
DWORD CCom::Read(LPVOID lpBuffer, DWORD dwNumberOfBytesToRead)
{
memset(lpBuffer, 0, dwNumberOfBytesToRead);
if (!IsOpen())
return 0;
DWORD dwErrors;
COMSTAT Stat;
ClearCommError(m_hCom, &dwErrors, &Stat);
DWORD dwNumberOfBytesRead = 0;
if (Stat.cbInQue > 0)
{
if (ReadFile(m_hCom, lpBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL))//
{/*CString Returndata;
Returndata.Format("%s",lpBuffer);
AfxMessageBox(Returndata);*/
return dwNumberOfBytesRead; }
}
ClearCommError(m_hCom, &dwErrors, &Stat);
return 0;
}
bool CCom::IsOpen()
{
return (m_hCom != INVALID_HANDLE_VALUE);
}
bool CCom::SetRts(bool bRTS)
{
return (EscapeCommFunction(m_hCom, (bRTS ? SETRTS : CLRRTS)) == TRUE);
}
bool CCom::Reopen(int Baudrate)
{
return Open(m_csName, Baudrate);
}
DWORD CCom::Write( LPVOID lpBuffer, DWORD dwNumberOfBytesToWrite, bool bRTS)//LPVOID
{
if (!IsOpen())
return 0;
if (bRTS)
SetRts(true);
PurgeComm(m_hCom,
PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR);//
DWORD dwNumberOfBytesWrite = 0;
if (!WriteFile(m_hCom, lpBuffer, dwNumberOfBytesToWrite, &dwNumberOfBytesWrite, NULL))
{
DWORD dwErrors;
COMSTAT Stat;
ClearCommError(m_hCom, &dwErrors, &Stat);
dwNumberOfBytesWrite = 0;
}
if (bRTS)
{
Sleep(10);
SetRts(false);
}
return dwNumberOfBytesWrite;
}
DWORD CCom::Readdata()
{
DWORD read;
unsigned char readdata[20];
ReadFile(m_hCom,readdata,4,&read,NULL);//接收atz回码
CString Returndata;
Returndata.Format("%s",readdata);
AfxMessageBox(Returndata);
return read;
}
DWORD CCom::Writedata()
{
DWORD written;
CString ModemOrder="abcd";
PurgeComm(m_hCom,PURGE_RXCLEAR);
WriteFile(m_hCom,ModemOrder,ModemOrder.GetLength(),&written,NULL);
return written;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -