关于AT指令控制GSM短信猫的问题

controstr controstr 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

打开串口
BOOL CComm::OpenComm(const char* pPort,
int nBaudRate/* = 115200*/,
int nParity/* = NOPARITY*/,
int nByteSize/* = 8*/,
int nStopBits/* = ONESTOPBIT*/)
{
COMMTIMEOUTS timeouts = { // 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms(n个字符总为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms
100 // 基本的(额外的)写超时时间: 100 ms
} ;
m_hComm = ::CreateFileA(
pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式 充许读写
0, // 共享方式: 必须以独占
NULL, // 默认的安全描述符 为0表示该 串口不可被子程序继承
OPEN_EXISTING, // 创建方式
0, // 属性及相关标志,这里使用异步方式应用FILE_FLAG_OVERLAPPED 异步I/O ;0:不需设置文件属性
NULL) ; // 不需参照模板文件 0:不能用模模板打开

if( m_hComm == INVALID_HANDLE_VALUE )
{
::OutputDebugStringA("打开串口失败!\n");
return FALSE;
}

::GetCommState(m_hComm,&m_dcb) ; // 取DCB
m_dcb.BaudRate = nBaudRate ; // 串口波特率
m_dcb.ByteSize = nByteSize ; // 一个字节的数据位个数,范围5~8
m_dcb.Parity = nParity ; // 校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零
m_dcb.StopBits = nStopBits ; // 停止位个数,0~2分别对应1位、1.5位、2位停止位
::SetCommState(m_hComm,&m_dcb) ; // 设置DCB

::SetupComm(m_hComm, 4096, 1024) ; //设置输入输出缓冲区大小
::SetCommTimeouts(m_hComm, &timeouts) ;//设置超时

return TRUE ;
}
// 初始化
BOOL CComm::InitGsm()
{
if ( m_hComm == NULL )
return FALSE;

char ans[128] = {0}; // 应答串

// 测试GSM-MODEM是否存在
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if ( strstr(ans, "OK") == NULL )
return FALSE;

// 此处代码,要不要都在ATD指令时都无回应
// ECHO OFF
//memset(ans, 0x0, sizeof(ans));
//WriteComm("ATE0\r", 5);
//ReadComm(ans, 128);

// 0:PUD模式
// 1:文本模式
memset(ans, 0x0, sizeof(ans));
WriteComm("AT+CMGF=0\n", 10);
ReadComm(ans, 128);

//WriteComm("AT+CSMS=1\n", 10);
//ReadComm(ans, 128);
//WriteComm("AT+CNMI=2,1\n", 12);
//ReadComm(ans, 128);

m_bIsOpen = TRUE;
return TRUE;
}

// 写数据
int CComm::WriteComm(void *pData, int nLength)
{
if ( m_hComm == NULL )
return -1;

DWORD dwBytes; // 串口发出的数据长度
::WriteFile(m_hComm, pData, (DWORD)nLength, &dwBytes, NULL);

return (int)dwBytes;
}

// 读数据
*/
int CComm::ReadComm(void* pData, int nLength)
{
if ( m_hComm == NULL )
return -1;

DWORD dwNum; // 串口收到的数据长度
::ReadFile(m_hComm, pData,(DWORD)nLength, &dwNum, NULL);

return (int)dwNum;
}

///// 拨号,实际中是我的真实号码
char *p = "ATD+8613800138000;\r";
"
int len = WriteComm(cmd, strlen(cmd));

char buf[128] = {0};
// 此处有延时,延时时间比较长,我试过从1秒-30秒
ReadComm(buf, 128);
/*

详细结果代码 数字化结果代码 说明
OK 0 呼叫成功,公对语音呼叫
CONNECT<speed> 10,11,12,13,14,15 呼叫成功,对数据电话<speed> 采用模块协商后的值
BUSY 7 补叫方忙
NO ANSWER 8 固定连接时间到后来检测到挂起信号
NO CARRIER 3 呼叫建立失败或远端用户已释放
*/


除接听电话,就会返回OK,其它都没有返回值,请大家帮帮忙这是什么原因。
...全文

相关推荐

c# 短信猫 at指令发短信

短信猫是基于GSM通信标准的模块,它通过AT(Attention)指令集来控制,这些指令集由Hayes公司最初为调制解调器设计。AT指令用于设置短信猫的工作模式、拨号、发送和接收数据等。

zidanezhang

C#串口控制短信猫实现离线短信群发

串口通信是嵌入式与工业设备交互的基础技术,其核心在于AT指令协议解析与SerialPort底层控制。理解波特率、超时机制、流控配置及响应状态机,是实现稳定硬件通信的前提。在物联网告警、政企内网通知等对网络依赖低、可控性要求高的场景中,基于C#直接操作USB短信猫的离线方案展现出独特价值——它规避云服务通道抖动、HTTPS证书失效与配额限制,同时需攻克中文UCS2编码、长短信UDH分段、并发背压控制等工程难点。本文聚焦C# SerialPort实战封装与AT指令健壮执行,提供可落地的硬件级短信群发解决方案。

用户甲

C#与AT指令结合控制短信猫实现短信发送

htmltable {th, td {th {pre {简介:本文介绍如何使用C#通过AT指令操作短信猫设备进行短信发送。首先解释AT指令和短信猫的工作原理,然后通过创建SerialPort对象在C#中与短信猫通信。示例代码展示了如何初始化串口,发送AT指令来设置短信模式、指定接收者号码和短信内容。还涉及如何使用DLL库简化通信流程以及错误处理和状态检查的重要性。掌握这些技术要点将有助于开发稳定、高效的短信发送应用程序。

雲明

GSM Modem AT指令实现中英文短信发送

在本文中,我们深入探讨了GSM Modem及其AT指令集的核心应用,并针对中英文混合短信的编码和发送提供了详细的技术解析。我们通过分析不同的编码技术如7-bit、8-bit和UCS2编码,深入了解了短信发送与接收的技术细节。在短信管理模块的实现部分,我们不仅讨论了功能需求,还重点强调了性能优化和用户体验的提升。错误处理和日志记录章节中,我们详细介绍了常见错误类型、错误处理策略以及日志记录的重要性。在提升项目独立性和移植性的章节中,我们讨论了代码模块化、封装、移植性优化策略以及跨平台兼容性测试的重要性。

创新工场

GSM短信猫测试调试工具

它基于标准的AT指令集进行操作和控制,这个指令集是串行通信中的通用标准,允许用户通过简单的文本命令来执行各种功能,如拨打电话、发送短信、读取信号强度等。

dadange
评论 13
收藏 已收藏
分享
返回顶部
controstr
硬件/系统 2,644 成员 17,229 内容