最近接了个小项目,初次使用SIM800L,为大家写一下我的使用历程
硬件:
备注:led快闪,正在连接,led慢闪,连接完毕
买回来大概长这样
排针天线未焊接
此时部分开发者焊上排针,不焊天线,也能用(不知道为啥,我不能用)
r接t,t接r,正常供3.3v电压,正确插SIM卡即可。
led一直处于快闪状态,走到空旷地方也不行(博主所遇),移动联通卡都换了也不行
有博主说,加天线后可增强信号,如果上面所述用不了,建议焊上天线
焊上天线,好转一点,空旷地方灯可慢闪,结果发送指令,一直返回\0,(本人所遇)(空旷地方,移动联通卡都不行)
于是查阅资料解锁第三形态(最后形态)
此时就需要你的手里东西多了,照图上这样焊好
终于可以正常发送AT指令了,而且移动测试屋里仍能接收信号
不过此时注意,供电5v!!!!!!!!!!
此时,r接t,t接r,正常供5v电压,正确插SIM卡即可。
发送AT指令,就可以正常使用了
这里直接贴指令,别的地方抄的,我这里也遇到一个问题,,这里直接给大家口述,
成功发送电话后,“>”串口里出来这样的东西,你先尝试发111,字母,这些简单的信息
他会一直回复“>”,怎么结束呢,大佬都说发hex的0x1A,我发了不好使,
重点:发hex的1A就行了,如下图
只要回复不是>并且信号挺好,一般会恢复三行什么东西,记不清了,不过短信就发成了
代码直接贴了,自己看吧
#include "GSM_usart2.h"
// #include "main.h"
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructer; //
USART_InitTypeDef USART_InitStructer; // 串口初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructer.GPIO_Pin = GPIO_Pin_2; // TX
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin = GPIO_Pin_3; // RX
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructer);
// Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // 串口2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道使能
NVIC_Init(&NVIC_InitStructure); // 根据指定的参数初始化VIC寄存器
USART_InitStructer.USART_BaudRate = bound; // 波特率
USART_InitStructer.USART_WordLength = USART_WordLength_8b; // 数据位8位
USART_InitStructer.USART_StopBits = USART_StopBits_1; // 设置停止位
USART_InitStructer.USART_Parity = USART_Parity_No; // 设置校检位
USART_InitStructer.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 关闭硬件控制模式
USART_InitStructer.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能
USART_Init(USART2, &USART_InitStructer); // 初始化串口2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 开启串口接受中断
USART_Cmd(USART2, ENABLE); // 使能串口2
}
void USART2_Send_data(char *str) // 发送字符串
{
while (*str != '\0') {
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2, *str);
str++;
}
}
void USART2_Send_data_value(u8 dat) // 发送单个字符
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == 0);
USART_SendData(USART2, dat);
}
int i;
char USART2_Buf[128]; // 接收数据缓存区
u8 Rec;
void USART2_IRQHandler(void) // 串口2中断服务程序
{
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // 接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Rec = USART_ReceiveData(USART2); // 读取接收到的数据
// delay_ms(2000);
// USART2_Send_data("53A8623F51856B63572871726C64");//发送内容
// delay_ms(5000);
// USART2_Send_data_value(0x1a);//结束
// USART2_Buf[i++] = Rec;//将数据存到字符数组中
// if(i>=4)//大于等于4说明字符已经接受完
// {
// printf("usart2_1 : %s\r\n",USART2_Buf);
// if(strcmp(USART2_Buf,"OK") > 0)
// {
// delay_ms(2000);
// USART2_Send_data("AT+CMGF=1\r\n");
if(strcmp(USART2_Buf,"OK") > 0)
{
// delay_ms(2000);
// USART2_Send_data("AT+CMGS=\"15696244077\"\r\n");//短信接受号码
// delay_ms(2000);
// USART2_Send_data("Warning:meter joint leaking\r\n");//发送短信内容
// delay_ms(5000);
// USART2_Send_data_value(0x1a);
// printf("USART2 : %s\r\n",USART2_Buf);
// USART_Cmd(USART2, DISABLE);
// }
// }
// i=0;
// }
}
}
#ifndef __GSM_USART2_H
#define __GSM_USART2_H
#include "stm32f10x.h"
#include "string.h"
void USART2_Init(u32 bound);
void USART2_Send_data(char *str);//发送字符串
void USART2_Send_data_value(u8 dat);//发送数值
#endif
//发送短信,已测试成功,信号灯慢闪表示连接成功
USART2_Send_data("AT+CMGF=1\r\n"); // 设置文本模式
Delay_ms(2000);
USART2_Send_data("AT+CMGS=\"1751688****\"\r\n");// 发送短信
Delay_ms(2000);
USART2_Send_data("hello_word\r\n");// 发送短信内容
Delay_ms(5000);
USART2_Send_data_value(0x1a); //发送短信结束
温馨提示记得初始化,波特率要选对,先串口调试好再接开发板,博主用的STM32C8T6,如果有用,感谢评论点赞
最后感谢网上写这篇文章的各位博主,我也是搜了好多实践的