SIM800L模块发送短信

因为项目需求需要使用到SIM短信模块,记录下SIM模块的使用记录。

1,准备工作
需要一块SIM模块,我使用的是SIM800L模块,淘宝可以购买到,如图所示,

推荐购买这一款,板上集成了电压模块,不需要单独使用3.7v供电,比较方便。

一张电话卡,自己手机的电话卡即可,同时还需要一个卡套,不然卡放不进去。

2,调试工作
插上卡,上电以后,模块会自动寻找信号,串口助手发送AT,
模块返回ok,表示成功。
然后发送 AT+CMGF=1 将短信模式设置为 text mode (模块默认是 pdu mode),

然后发送 AT+CMGS=“此处输入对应的电话号码”,等待模块返回 ‘>’ 字符,输入短信内容,
短信内容输入完成以后,发送十六进制的0x1a完成发送,记住,是16进制的。
如果一切顺利,此时你的手机可以收到你的短信。

3,单片机移植
已经知道了at指令的流程,就需要配置串口就行了。
串口.h文件的配置,使用的stm32的串口2

// ´®¿Ú2-USART2
#define  DEBUG_USARTx                   USART2
#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO Òý½Åºê¶¨Òå
#define  DEBUG_USART_GPIO_CLK           RCC_APB2Periph_GPIOA
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  DEBUG_USART_TX_GPIO_PORT         GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_2
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3

#define  DEBUG_USART_IRQ                USART2_IRQn
#define  DEBUG_USART_IRQHandler         USART2_IRQHandler

c文件的定义

void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// ´ò¿ª´®¿ÚGPIOµÄʱÖÓ
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// ´ò¿ª´®¿ÚÍâÉèµÄʱÖÓ
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// ½«USART TxµÄGPIOÅäÖÃΪÍÆÍ츴ÓÃģʽ
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // ½«USART RxµÄGPIOÅäÖÃΪ¸¡¿ÕÊäÈëģʽ
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// ÅäÖô®¿ÚµÄ¹¤×÷²ÎÊý
	// ÅäÖò¨ÌØÂÊ
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// ÅäÖà ÕëÊý¾Ý×Ö³¤
	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(DEBUG_USARTx, &USART_InitStructure);

	// ʹÄÜ´®¿Ú
	USART_Cmd(DEBUG_USARTx, ENABLE);	    
}

接下来是发送函数的定义
只用到了三个函数

``

/*****************  ·发送字符**********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ýµ½USART */
	USART_SendData(pUSARTx,ch);
		
	/* µÈ´ý·¢ËÍÊý¾Ý¼Ä´æÆ÷Ϊ¿Õ */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}
/*****************  发送字符串**********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* µÈ´ý·¢ËÍÍê³É */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)!=SET);
  
}

/***************** 发送16进制数**********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
	uint8_t temp_h, temp_l;
	
	/* È¡³ö¸ß°Ëλ */
	temp_h = (ch&0XFF00)>>8;
	/* È¡³öµÍ°Ëλ */
	temp_l = ch&0XFF;
	
	/* ·¢Ë͸߰Ëλ */
	USART_SendData(pUSARTx,temp_h);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
	/* ·¢Ë͵ͰËλ */
	USART_SendData(pUSARTx,temp_l);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}
只用这三个函数就够了

```bash
Usart_SendString( DEBUG_USARTx,"AT\r\n");

  delay();
  Usart_SendString( DEBUG_USARTx,"AT+CMGF=1\r\n");
  delay();

  Usart_SendString( DEBUG_USARTx,"AT+CMGS=\"填入自己的手机号\"\r\n");
delay();

Usart_SendString( DEBUG_USARTx,"warning! warning !\r\n");
 delay();
//	printf("0x%x",aa);
	Usart_SendHalfWord(DEBUG_USARTx,0x1a);

=按照顺序发送at指令,就可以了。

sim800l的最简单的发送短信在单片机上面就这样跑起来了。
谢谢观看

  • 16
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
发送短信需要使用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)结尾。 以上是一个简单的示例代码,您可以根据实际情况进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值