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