SIM800L模块发送短信

Keelia ·
更新时间:2024-09-21
· 586 次阅读

因为项目需求需要使用到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的最简单的发送短信在单片机上面就这样跑起来了。
谢谢观看


作者:菜鸡一枚。。。。



发送短信

需要 登录 后方可回复, 如果你还没有账号请 注册新账号