基于STM32单片机SIM800C模块发送短信的代码
时间: 2024-01-11 19:02:26 浏览: 115
基于STM32控制SIM800C打电话发短信程序
5星 · 资源好评率100%
以下是基于STM32单片机和SIM800C模块发送短信的代码,供参考:
首先,需要定义一些常量和变量:
```c
#define SIM800C_USART USART3
#define SIM800C_USART_RCC RCC_APB1Periph_USART3
#define SIM800C_USART_GPIO_RCC RCC_AHB1Periph_GPIOB
#define SIM800C_USART_TX_PIN GPIO_Pin_10
#define SIM800C_USART_TX_GPIO GPIOB
#define SIM800C_USART_RX_PIN GPIO_Pin_11
#define SIM800C_USART_RX_GPIO GPIOB
#define SIM800C_PWRKEY_GPIO_RCC RCC_AHB1Periph_GPIOC
#define SIM800C_PWRKEY_GPIO GPIOC
#define SIM800C_PWRKEY_PIN GPIO_Pin_13
#define SIM800C_PWRKEY_ON GPIO_SetBits(SIM800C_PWRKEY_GPIO, SIM800C_PWRKEY_PIN)
#define SIM800C_PWRKEY_OFF GPIO_ResetBits(SIM800C_PWRKEY_GPIO, SIM800C_PWRKEY_PIN)
char message[100]; // 存储短信内容
```
然后,需要初始化USART3和SIM800C模块:
```c
void SIM800C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 使能GPIO时钟
RCC_AHB1PeriphClockCmd(SIM800C_PWRKEY_GPIO_RCC, ENABLE);
RCC_AHB1PeriphClockCmd(SIM800C_USART_GPIO_RCC, ENABLE);
// 配置GPIO为输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = SIM800C_PWRKEY_PIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SIM800C_PWRKEY_GPIO, &GPIO_InitStructure);
// 配置USART3
RCC_APB1PeriphClockCmd(SIM800C_USART_RCC, ENABLE);
GPIO_PinAFConfig(SIM800C_USART_TX_GPIO, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(SIM800C_USART_RX_GPIO, GPIO_PinSource11, GPIO_AF_USART3);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = SIM800C_USART_TX_PIN | SIM800C_USART_RX_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(SIM800C_USART_TX_GPIO, &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(SIM800C_USART, &USART_InitStructure);
// 使能USART3
USART_Cmd(SIM800C_USART, ENABLE);
// 初始化SIM800C模块
SIM800C_PWRKEY_OFF;
delay_ms(1000);
SIM800C_PWRKEY_ON;
delay_ms(1000);
SIM800C_PWRKEY_OFF;
delay_ms(3000);
}
```
发送短信的函数如下:
```c
void SIM800C_SendSMS(char* number, char* message)
{
char buffer[50]; // 存储AT指令
// 发送AT指令,检查模块是否处于就绪状态
USART_SendString(SIM800C_USART, "AT\r\n");
if (!USART_WaitForResponse(SIM800C_USART, "OK", 1000))
{
return;
}
// 发送AT+CMGF=1指令,设置短信格式为文本模式
USART_SendString(SIM800C_USART, "AT+CMGF=1\r\n");
if (!USART_WaitForResponse(SIM800C_USART, "OK", 1000))
{
return;
}
// 发送AT+CMGS="number"指令,设置短信接收方号码
sprintf(buffer, "AT+CMGS=\"%s\"\r\n", number);
USART_SendString(SIM800C_USART, buffer);
if (!USART_WaitForResponse(SIM800C_USART, ">", 1000))
{
return;
}
// 发送短信内容
USART_SendString(SIM800C_USART, message);
USART_SendByte(SIM800C_USART, 0x1A);
// 等待短信发送完成
USART_WaitForResponse(SIM800C_USART, "+CMGS:", 10000);
}
```
其中,`USART_SendString`和`USART_SendByte`函数用于发送AT指令和短信内容,`USART_WaitForResponse`函数用于等待模块返回的响应。
最后,使用以下代码发送短信:
```c
SIM800C_Init();
strcpy(message, "Hello, World!");
SIM800C_SendSMS("13312345678", message);
```
其中,第一个参数为短信接收方的号码,第二个参数为短信内容。
阅读全文