SIM800L串口+STM32初使用

最近接了个小项目,初次使用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,如果有用,感谢评论点赞

最后感谢网上写这篇文章的各位博主,我也是搜了好多实践的

发送短信需要使用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)结尾。 以上是一个简单的示例代码,您可以根据实际情况进行修改和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值