STM32F103C8T6通过SIM800c发送中文短信编程
时间: 2023-09-17 21:11:18 浏览: 195
在STM32F103C8T6上通过SIM800c模块发送中文短信,可以通过以下步骤实现:
1.配置SIM800c模块的串口通信参数,如波特率、数据位、校验位和停止位等。
2.使用AT指令设置SIM800c模块的短信中心号码和短信格式等信息。
3.通过AT指令发送中文短信内容,需要将中文转换成UCS2编码格式,并计算出UCS2编码格式的长度。
以下是一个简单的示例代码,用于在STM32F103C8T6上通过SIM800c模块发送中文短信:
```c
#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#define SIM800C_USART USART2
void SIM800C_SendCmd(char *cmd)
{
while (*cmd)
{
USART_SendData(SIM800C_USART, *cmd++);
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
}
}
void SIM800C_SendString(char *str)
{
while (*str)
{
USART_SendData(SIM800C_USART, *str++);
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
}
}
void SIM800C_SendUCS2(char *ucs2_str, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i += 2)
{
USART_SendData(SIM800C_USART, ucs2_str[i + 1]);
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
USART_SendData(SIM800C_USART, ucs2_str[i]);
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
}
}
int main(void)
{
char cmd[64], str[64], ucs2_str[128];
uint16_t len;
// 串口初始化
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
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(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
// 配置SIM800c模块
SIM800C_SendCmd("AT+CMGF=1\r\n"); // 短信格式为文本模式
SIM800C_SendCmd("AT+CSCS=\"UCS2\"\r\n"); // 短信编码为UCS2
SIM800C_SendCmd("AT+CSCA=\"+8613800250500\"\r\n"); // 短信中心号码
// 发送中文短信
sprintf(str, "你好,世界!"); // 中文字符串
len = strlen(str) * 2; // 计算UCS2编码格式的长度
memset(ucs2_str, 0, sizeof(ucs2_str)); // 清空UCS2字符串
for (int i = 0; i < strlen(str); i++)
{
sprintf(cmd, "%04x", str[i]); // 将中文字符转换成UCS2编码格式
strcat(ucs2_str, cmd); // 将UCS2编码格式的字符拼接成UCS2字符串
}
SIM800C_SendCmd("AT+CMGS=\"+8613800000000\"\r\n"); // 接收短信的手机号码
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
SIM800C_SendUCS2(ucs2_str, len); // 发送UCS2字符串
USART_SendData(SIM800C_USART, 0x1A); // 发送Ctrl+Z结束短信
while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);
while (1);
}
```
注意:以上代码仅供参考,实际应用中需要根据具体情况进行修改。