GSM模块(SIM800L)收发短信 串口调试

其实我感觉应该不止用于SIM800L,其他GSM模块也大同小异,估计也差不多。
总结下我调试模块遇到的问题,与大家分享一下,同时也梳理一下自己的思路好移植到单片机上。

我也不打电话,所以模块的接线只用接4个脚,如下图(感觉不用说…)
实物图

电源问题

刚买来这个模块也没在意,也没接触过GSM模块,以为和其他普通模块一样,结果它是3.7~4.2V供电,这使我很茫然。亲测3.3V也可以使模块工作,但是貌似总是重启。
具体现象就是时不时地显示下面内容

Call Ready
SMS Ready

这时就要考虑电源问题了。
看卖家和网上说可以用5V(大于等于500mA)电源加一个二极管和一个1000uF的电容就可以解决,以下是卖家的电路图:

电源电路

这样估计就不会一直重启了。。。好像是。。。

发送中文短信

推荐调试使用 SSCOM 它好用啊!可以存储AT指令,如图:在这里插入图片描述

英文的我发送不了,不知道为什么,但是可以通过信息中心发中文。。。

可能是没买天线,我这里向大家推荐,买这玩意儿一定要带个天线,我当初买的时候没注意2块钱加PCB天线,信号经常不好,这阵儿我还寻思定个天线呢,你说费劲不。。。下回我得做好功课了。。

首先,感谢论坛里大佬们的文章,我很懒,懒得康手册,直接来论坛搜索。。。参考了 嘘、小点声
GSM短信发送与电话等
这篇博客,十分感谢。我就不再复述了,这位大佬写的很详细,大家先看完再回来(或者不用回来了,估计已经学会了 ( ̄▽ ̄)~*)

说下我都用了哪些AT指令吧。。

AT
OK
//-------------------------------------------
AT+CPIN?		//检测SIM卡
+CPIN: READY

OK
//-------------------------------------------
AT+CSQ			//检查网络信号强度和SIM卡情况
+CSQ: 22,0			//(这次运气好,原来经常0,0)

OK
//-------------------------------------------
AT+CMGF=0		//=0 PDU		=1 文本模式
OK
//-------------------------------------------
AT+CSCS="GSM"	//选择字符集
OK
//-------------------------------------------
AT+CMGS=25		//不一定是25 我学习了 爱听评书 的大佬
> 				//具体是几  还是去上面分享的链接去康康
//-------------------------------------------
0891683108100005F011000D91683104011415F60008000A62117231542C8BC44E66
//这个码怎么来的  还是在上面的链接里...(做菜博客) 我在下面简单分析一下
//注意这个 “箭头”  这就是 0x1A 如果复制了 就不用单独发下面的0x1A了
//就这行 不要发送回车(0x0D 0x0A)
//-------------------------------------------------------------
//单独发送 0x1A				成功了就会如下
+CMGS: 27

OK
//失败了就 ERROR		经常失败 多发几回  我估计是天线的问题,
//                                   等我买了再试试,到时候评论

到这儿 中文短信就发送完了,祝君成功!

分析一下发送的一串带代表什么含义,和“AT+CMGS=25”中的25是怎么来的。
在这里插入图片描述
“AT+CMGS=25”中的25是
0891683108100005F011000D91683104011415F60008000A62117231542C8BC44E66
中的
11000D91683104011415F60008000A62117231542C8BC44E66
字节个数/2
50/2 = 25
后期移植的话需要修改短信内容就要修改:

  1. 短信内容
  2. 短信内容前面的长度
  3. AT+CMGS=?

接收短信

这里我也不是很明白,但是可以接收,大家参考下就好。。。
(其实哪儿都不明白)
每个模块的指令或许有些不同,但是你可以查,比如说设置波特率指令 AT+IPR

AT+IPR?//询问当前波特率是多少
AT+IPR=?//中间加个等号,代表询问波特率能设置成啥,我的模块回复是:
+IPR: (),
(0,1200,2400,4800,9600,19200,38400,57600,115200,230400,460800)
代表参数得写括号里的参数,比如 AT+IPR=19200

再比如说 优先信息存储指令 AT+CPMS

AT+CPMS?//就是询问当前存储设置是什么
AT+CPMS=?//还是,加了个“=”号就是询问这个指令可以填啥,因此,如果你按照其他人的指令设置发现错误了,可以考虑下指令是否不兼容的问题,先查一下,我的模块对此回复的是:
+CPMS: (“SM”,“ME”,“SM_P”,“ME_P”,“MT”),
(“SM”,“ME”,“SM_P”,“ME_P”,“MT”),
(“SM”,“ME”,“SM_P”,“ME_P”,“MT”)
OK
//因此我有5种载体可以选择(但我都不知道啥意思,我不管,就存SIM卡就完事儿了)
AT+CPMS=“SM”,“SM”,“SM”
//具体指令解释 自己Baidu 或者 这个链接
AT指令:AT+CPMS

AT&W” 指令是保存模块参数设置,比如你把波特率调整为19200,如果保存了,下次开机就是19200,不用再次设置,其他参数也适用(或者大部分,反正挺多设置都保存了),因此,可以先在PC上调整好了,单片机就不用开机一系列调整了。

短信接收不到,可能是没调 新信息指示AT+CNMI指令进行设置,具体指令各参数参见传送门:AT+CNMI指令详解
我查下我的模块此参数设置是

AT+CNMI?
+CNMI: 2,1,0,1,1

设置过后,发送个短信给模块,会收到提示了(不知道用不用设置AT+CSCS="GSM"和AT+CMGF=0,好像得要AT+CMGF=0才能读中文,好像是啊,我不知道,懒得试。。。)

+CMTI: “SM”,6//6说明存储地址

这时可以用 AT+CMGL=0 指令或者用 AT+CMGR=6 指令来查短信内容

AT+CMGL=? //我的列表指令参数是数字,我看网上有的模块是字符串,如“REC UNREAD”、“REC READ”、“ALL”等,因此可以查下,然后再设置
+CMGL: (0,1,2,3,4)
AT+CMGL=0 读取未读消息
AT+CMGL=1 读取已读消息
AT+CMGL=2 读取未发送消息
AT+CMGL=3 读取已发送消息
AT+CMGL=4 表示读取所有的短信

+CMTI: “SM”,6//6说明存储地址
AT+CMGR=6//上面提示我在6号地址,因此我读6
AT+CMGR 意思是: 读短信,信息从AT+CPMS(信息存储指令,上面有交代) 命令设定的存储器读取

助手调试截图OK,解码我还没研究,就先这样吧,感觉啥也没说。。。!
对了,最后我发的短信是 123Hello
祝大家成功!
参考传送门:
AT指令(中文详解版)(一)
AT指令(中文详解版)(二)
AT指令(中文详解版)(三)
GSM之AT操作命令详解20160615

  • 16
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
发送短信需要使用SIM800L模块和STM32单片机进行通信,以下是大致的步骤: 1. 安装SIM800L模块并将其连接到STM32单片机SIM800L模块可以通过串口与单片机通信,因此必须将模块上的TX和RX引脚连接到单片机上的相应引脚。 2. 初始化串口通信。首先需要设置单片机的串口通信参数,包括波特率、数据位、停止位和校验位等,然后通过串口发送AT指令,以检查SIM800L模块是否正常工作。 3. 发送短信。发送短信需要使用AT指令,首先需要设置短信中心号码(SMSC)和接收方手机号码,然后通过AT+CMGS指令将短信内容发送给SIM800L模块。 以下是一个简单的示例代码,可以用于在STM32单片机上发送短信: ``` #include "stm32f10x.h" #include "stdio.h" #include "string.h" #define BUFFERSIZE 100 void USART1_Init(void); void USART1_SendChar(char ch); void USART1_SendString(char* str); void delay_ms(uint16_t ms); void SIM800L_SendCommand(char* cmd); void SIM800L_SendSMS(char* phone_number, char* message); int main(void) { char phone_number[] = "+8612345678901"; // 接收方手机号码 char message[] = "Hello, this is a test message!"; // 短信内容 USART1_Init(); SIM800L_SendCommand("AT\r\n"); // 发送AT指令 delay_ms(100); SIM800L_SendSMS(phone_number, message); // 发送短信 while(1) { } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } void USART1_SendString(char* str) { while(*str) { USART1_SendChar(*str); str++; } } void delay_ms(uint16_t ms) { volatile uint32_t nCount; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); nCount = (RCC_Clocks.HCLK_Frequency / 10000) * ms; for(; nCount != 0; nCount--); } void SIM800L_SendCommand(char* cmd) { USART1_SendString(cmd); delay_ms(1000); } void SIM800L_SendSMS(char* phone_number, char* message) { char buffer[BUFFERSIZE]; memset(buffer, 0, BUFFERSIZE); sprintf(buffer, "AT+CMGF=1\r\n"); // 设置短信格式为文本格式 SIM800L_SendCommand(buffer); memset(buffer, 0, BUFFERSIZE); sprintf(buffer, "AT+CMGS=\"%s\"\r\n", phone_number); // 设置接收方手机号码 SIM800L_SendCommand(buffer); memset(buffer, 0, BUFFERSIZE); sprintf(buffer, "%s\x1A", message); // 设置短信内容 SIM800L_SendCommand(buffer); } ``` 在上面的示例代码中,首先通过USART1_Init()函数初始化串口通信。然后在main()函数中,先发送一个AT指令以检查SIM800L模块是否正常工作,然后调用SIM800L_SendSMS()函数发送短信SIM800L_SendSMS()函数中,首先使用AT+CMGF=1指令设置短信格式为文本格式,然后使用AT+CMGS指令设置接收方手机号码,并将短信内容发送给SIM800L模块。注意,短信内容需要以Ctrl+Z字符(ASCII码为0x1A)结尾。 以上是一个简单的示例代码,您可以根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值