📄 operatecomm.cpp
字号:
// operatecomm.cpp: implementation of the Coperatecomm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ModemSMS.h"
#include "operatecomm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Coperatecomm::Coperatecomm()
{
}
Coperatecomm::~Coperatecomm()
{
}
HANDLE hComm;
// 初始化GSM状态
BOOL Coperatecomm::gsmInit()
{
char ans[128]; // 应答串
int i,j;
i = j = 0;
// 测试GSM-MODEM的存在性
// while(i<=5)
{
i=i+1;
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL)
{
WriteComm("AT\r", 3);
ReadComm(ans, 128);
}
// else
// break;
}
//return FALSE;
// ECHO OFF
WriteComm("ATE0\r", 5);
ReadComm(ans, 128);
// PDU模式
/*WriteComm("AT+CMGF=0\r", 10);
ReadComm(ans, 128);*/
return TRUE;
}
// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int Coperatecomm::ReadComm(void *pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度
ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
return (int)dwNumRead;
}
// 写串口
// 输入: pData - 待写的数据缓冲区指针
// nLength - 待写的数据长度
// 返回: 实际写入的数据长度
int Coperatecomm::WriteComm(char *pData, int nLength)
{
//DWORD dwBytesToWrite;
//dwBytesToWrite;
//BOOL bWriteState;
DWORD dwNumWrite; // 串口发出的数据长度
WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
return (int)dwNumWrite;
}
// 打开串口
// 输入: pPort - 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者
// nBaudRate - 波特率
// nParity - 奇偶校验
// nByteSize - 数据字节宽度
// nStopBits - 停止位
BOOL Coperatecomm::OpenComm(const char *pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts = { // 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100}; // 基本的(额外的)写超时时间: 100 ms
hComm = CreateFile(pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
if(hComm == INVALID_HANDLE_VALUE) return FALSE; // 打开串口失败
GetCommState(hComm, &dcb); // 取DCB
dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;
SetCommState(hComm, &dcb); // 设置DCB
SetupComm(hComm, 4096, 1024); // 设置输入输出缓冲区大小
SetCommTimeouts(hComm, &timeouts); // 设置超时
return TRUE;
}
BOOL Coperatecomm::CloseComm()
{
return CloseHandle(hComm);
}
void Coperatecomm::PutSendMessage(SM_PARAM *pparam)
{
EnterCriticalSection(&m_csSend);
memcpy(&m_SmSend[m_nSendIn], pparam, sizeof(SM_PARAM));
m_nSendIn++;
if (m_nSendIn >= MAX_SM_SEND) m_nSendIn = 0;
LeaveCriticalSection(&m_csSend);
}
/*
int Coperatecomm::gsmSendMessage(SM_PARAM *pSrc)
{
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
char pdu[512]; // PDU串
char ans[128]; // 应答串
nPduLength = m_gsmcomm.gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
m_gsmcomm.gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令
// TRACE("%s", cmd);
// TRACE("%s\n", pdu);
WriteComm(cmd, strlen(cmd)); // 先输出命令串
nLength = ReadComm(ans, 128); // 读应答数据
// 根据能否找到"\r\n> "决定成功与否
if(nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0)
{
return WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串
}
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -