因为项目需求需要使用到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
1 |
<span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USARTx USART2</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_CLK RCC_APB1Periph_USART2</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_BAUDRATE 115200</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_GPIO_CLK RCC_APB2Periph_GPIOA</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_TX_GPIO_PORT GPIOA </span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_TX_GPIO_PIN GPIO_Pin_2</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_RX_GPIO_PORT GPIOA</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_RX_GPIO_PIN GPIO_Pin_3</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_IRQ USART2_IRQn</span> <span class="token macro property">#<span class="token directive keyword">define</span> DEBUG_USART_IRQHandler USART2_IRQHandler</span> |
c文件的定义
1 |
<span class="token keyword">void</span> <span class="token function">USART_Config</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> GPIO_InitTypeDef GPIO_InitStructure<span class="token punctuation">;</span> USART_InitTypeDef USART_InitStructure<span class="token punctuation">;</span> <span class="token function">DEBUG_USART_GPIO_APBxClkCmd</span><span class="token punctuation">(</span>DEBUG_USART_GPIO_CLK<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">DEBUG_USART_APBxClkCmd</span><span class="token punctuation">(</span>DEBUG_USART_CLK<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Pin <span class="token operator">=</span> DEBUG_USART_TX_GPIO_PIN<span class="token punctuation">;</span> GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Mode <span class="token operator">=</span> GPIO_Mode_AF_PP<span class="token punctuation">;</span> GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Speed <span class="token operator">=</span> GPIO_Speed_50MHz<span class="token punctuation">;</span> <span class="token function">GPIO_Init</span><span class="token punctuation">(</span>DEBUG_USART_TX_GPIO_PORT<span class="token punctuation">,</span> <span class="token operator">&</span>GPIO_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Pin <span class="token operator">=</span> DEBUG_USART_RX_GPIO_PIN<span class="token punctuation">;</span> GPIO_InitStructure<span class="token punctuation">.</span>GPIO_Mode <span class="token operator">=</span> GPIO_Mode_IN_FLOATING<span class="token punctuation">;</span> <span class="token function">GPIO_Init</span><span class="token punctuation">(</span>DEBUG_USART_RX_GPIO_PORT<span class="token punctuation">,</span> <span class="token operator">&</span>GPIO_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_BaudRate <span class="token operator">=</span> DEBUG_USART_BAUDRATE<span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_WordLength <span class="token operator">=</span> USART_WordLength_8b<span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_StopBits <span class="token operator">=</span> USART_StopBits_1<span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_Parity <span class="token operator">=</span> USART_Parity_No <span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_HardwareFlowControl <span class="token operator">=</span> USART_HardwareFlowControl_None<span class="token punctuation">;</span> USART_InitStructure<span class="token punctuation">.</span>USART_Mode <span class="token operator">=</span> USART_Mode_Rx <span class="token operator">|</span> USART_Mode_Tx<span class="token punctuation">;</span> <span class="token function">USART_Init</span><span class="token punctuation">(</span>DEBUG_USARTx<span class="token punctuation">,</span> <span class="token operator">&</span>USART_InitStructure<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">USART_Cmd</span><span class="token punctuation">(</span>DEBUG_USARTx<span class="token punctuation">,</span> ENABLE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
接下来是发送函数的定义
只用到了三个函数
``
1 |
<span class="token keyword">void</span> <span class="token function">Usart_SendByte</span><span class="token punctuation">(</span> USART_TypeDef <span class="token operator">*</span> pUSARTx<span class="token punctuation">,</span> uint8_t ch<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token function">USART_SendData</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span>ch<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">USART_GetFlagStatus</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span> USART_FLAG_TXE<span class="token punctuation">)</span> <span class="token operator">==</span> RESET<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token function">Usart_SendString</span><span class="token punctuation">(</span> USART_TypeDef <span class="token operator">*</span> pUSARTx<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>str<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">unsigned</span> <span class="token keyword">int</span> k<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">do</span> <span class="token punctuation">{<!-- --></span> <span class="token function">Usart_SendByte</span><span class="token punctuation">(</span> pUSARTx<span class="token punctuation">,</span> <span class="token operator">*</span><span class="token punctuation">(</span>str <span class="token operator">+</span> k<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> k<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>str <span class="token operator">+</span> k<span class="token punctuation">)</span><span class="token operator">!=</span><span class="token string">'\0'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">USART_GetFlagStatus</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span>USART_FLAG_TC<span class="token punctuation">)</span><span class="token operator">!=</span>SET<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">void</span> <span class="token function">Usart_SendHalfWord</span><span class="token punctuation">(</span> USART_TypeDef <span class="token operator">*</span> pUSARTx<span class="token punctuation">,</span> uint16_t ch<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> uint8_t temp_h<span class="token punctuation">,</span> temp_l<span class="token punctuation">;</span> temp_h <span class="token operator">=</span> <span class="token punctuation">(</span>ch<span class="token operator">&</span><span class="token number">0XFF00</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token number">8</span><span class="token punctuation">;</span> temp_l <span class="token operator">=</span> ch<span class="token operator">&</span><span class="token number">0XFF</span><span class="token punctuation">;</span> <span class="token function">USART_SendData</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span>temp_h<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">USART_GetFlagStatus</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span> USART_FLAG_TXE<span class="token punctuation">)</span> <span class="token operator">==</span> RESET<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">USART_SendData</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span>temp_l<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">USART_GetFlagStatus</span><span class="token punctuation">(</span>pUSARTx<span class="token punctuation">,</span> USART_FLAG_TXE<span class="token punctuation">)</span> <span class="token operator">==</span> RESET<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1 |
只用这三个函数就够了 ```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的最简单的发送短信在单片机上面就这样跑起来了。
谢谢观看