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的最简单的发送短信在单片机上面就这样跑起来了。
谢谢观看

猜你喜欢

转载自blog.csdn.net/weixin_42150905/article/details/105450722