📄 comm.cpp
字号:
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SMSDemo.h"
#include "Comm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComm::CComm()
{
m_hComm = INVALID_HANDLE_VALUE;
}
CComm::~CComm()
{
}
// 打开串口
// pPort: 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者
// nBaudRate: 波特率
// nParity: 奇偶校验
// nByteSize: 数据字节宽度
// nStopBits: 停止位
BOOL CComm::Open(LPCTSTR pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts = { // 串口超时控制参数
0, // 读字符间隔超时时间: 100 ms
0, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
0, // 基本的(额外的)读超时时间: 500 ms
0, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
0}; // 基本的(额外的)写超时时间: 100 ms
/*
COMMTIMEOUTS timeouts = { // 串口超时控制参数
300, // 读字符间隔超时时间: 100 ms
10, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
1000, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100}; // 基本的(额外的)写超时时间: 100 ms
*/
m_hComm = CreateFile(pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
FILE_FLAG_NO_BUFFERING, // 不需设置文件属性
NULL); // 不需参照模板文件
if(m_hComm == INVALID_HANDLE_VALUE) return FALSE; // 打开串口失败
GetCommState(m_hComm, &dcb); // 取DCB
dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;
SetCommState(m_hComm, &dcb); // 设置DCB
SetupComm(m_hComm, 4096, 4); // 设置输入输出缓冲区大小
BOOL bRet = ::SetCommTimeouts(m_hComm, &timeouts); // 设置超时
return TRUE;
}
// 关闭串口
BOOL CComm::Close()
{
return CloseHandle(m_hComm);
}
// 写串口
// pData: 待写的数据缓冲区指针
// nLength: 待写的数据长度
void CComm::Write(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度
WriteFile(m_hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
/*
DWORD dwNumWrite = 0; // 串口发出的数据长度
LPCTSTR p = (LPCTSTR)pData;
//WriteFile(m_hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
for(int i=0; i<nLength; i++)
{
WriteFile(m_hComm, &p[i], (DWORD)1, &dwNumWrite, NULL);
Sleep(100);
}
*/
}
// 读串口
// pData: 待读的数据缓冲区指针
// nLength: 待读的最大数据长度
// 返回: 实际读入的数据长度
//ReadResponsion()
int CComm::Read(void* pData, int nLength, DWORD dwTimeOut)
{
DWORD dwNumRead = 0; // 串口收到的数据长度
//ReadFile(m_hComm, pData, nLength, &dwNumRead, NULL);
LPCTSTR buffer = (LPCTSTR)pData;
while(TRUE)
{
COMSTAT ComStat;
DWORD dwBytesRead, dwErrorFlags;
ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
if(ComStat.cbInQue)
{
//DWORD dwWantRead = min(ComStat.cbInQue, nLength - ;
ReadFile(m_hComm, (void*)&buffer[dwNumRead], ComStat.cbInQue, &dwBytesRead, NULL);
dwNumRead += dwBytesRead;
if(strstr(buffer, "OK\r\n") || strstr(buffer, "ERROR\r\n"))
break;
}
else
{
MSG msg;
if (::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
::DispatchMessage(&msg);
}
}
/*
//先进行等待直到读取到一个字节
DWORD dwStartTicks = GetTickCount();
while(TRUE)
{
if ((::GetTickCount() - dwStartTicks) > dwTimeOut)
return -1;
DWORD nRead = 0;
if(ReadFile(m_hComm, pData, 1, &nRead, NULL) && nRead == 1)
break;
else
Sleep(100);
}
//继续读取其他部分
LPCTSTR szBUffer = (LPCTSTR)pData;
dwNumRead = 1;
while(dwNumRead < (DWORD)nLength)
{
DWORD nRead = 0;
if(ReadFile(m_hComm, (void*)&szBUffer[dwNumRead], 1, &nRead, NULL) && nRead == 1)
dwNumRead ++;
else
break;
}
*/
return (int)dwNumRead;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -