/*************笔记****************
1、本SIM800L模块采用huart3(串口3),然后huart1(串口1)作为调试输出。
2、CudeMX配置huart3:------------------------------------------Mode        --> Asynchronous(异步)Baud Rate   --> 9600 Bit/sWord Length --> 8 BitParity      --> NoneStop Bits   --> 1------------------------------------------NVIC        --> 串口中断使能------------------------------------------DMA         --> Add 增加RX TX--> Data Width --> Byte------------------------------------------
3、需要FreeRTOS系统支持,需要"uartext.c"、"uartext.h"
4、本代码末尾有FreeRTOS任务模板。StartGSMTask()
5、
***********************************/
#include "SIM800L.h"
#include <stdlib.h>
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
#include "uartext.h"extern UART_HandleTypeDef huart3;//串口3
extern uint8_t SIM800L_Get_text[32];
extern uint8_t Address;/*********************************************************
函数名:SIM800L_Check_Cmd
功  能:发送命令后,检测接收到的应答
形  参:str--期待的应答结果
返回值:0--没有得到期待的应答结果 *?*--期待应答结果的位置(str的位置)
备  注:
**********************************************************/
uint8_t* SIM800L_Check_Cmd(uint8_t *str)
{char *strx = 0;strx = strstr((const char*)SIM800L_Get_text, (const char*)str); //寻找文本(被寻找,欲寻找)return (uint8_t*)strx;
}/********************************************
函数名:SIM800L_Send_Cmd
功  能:向GSM发送命令
形  参:cmd:发送的命令字符串(不需要添加回车了)ack:期待的应答结果,如果为空,则表示不需要等待应答waittime:等待时间(单位:100ms)
返回值:0--发送成功(得到了期待的应答结果)1--发送失败
备  注:
*********************************************/
uint8_t SIM800L_Send_Cmd(uint8_t *cmd, uint8_t *ack, u16 WaitTime)
{uint8_t res = 0;uint8_t TxBuffer[32];uint8_t len;sprintf((char *)TxBuffer, "%s\r\n", cmd);UartPutStr(&huart3, TxBuffer, strlen((char *)TxBuffer));//发给串口3if(ack && WaitTime)     //需要等待应答{while(--WaitTime)    //等待倒计时{osDelay(100);len = UartGetStr(&huart3, SIM800L_Get_text); //从串口3读取一次数据if(len > 1) //接收期待的应答结果{if(SIM800L_Check_Cmd(ack)){break;//得到有效数据}}}if(WaitTime == 0){res = 1;}}return res;
}/*********************************************************
函数名:SIM800L_Info_Show
功  能:GSM检测(SIM卡准备和是否注册成功)
形  参:无
返回值:2--正常  其他--错误代码
备  注:
**********************************************************/
uint8_t SIM800L_Info_Show(void)
{static uint8_t sim_flag = 0;uint8_t TxBuffer[40];switch(sim_flag){case 0:if(SIM800L_Send_Cmd("AT+CPIN?", "OK", 20)) //查询SIM卡是否在位{sprintf((char *)TxBuffer, "%d,02,05,Not SIM Crad\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}else{sim_flag = 1;sprintf((char *)TxBuffer, "%d,02,05,SIM Crad Yes\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}break;case 1:if(SIM800L_Send_Cmd("AT+CREG?", "+CREG: 0,1", 20)) //查询SIM卡网络是否已注册{sprintf((char *)TxBuffer, "%d,02,05,Network Registering!\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}else{sim_flag = 2;sprintf((char *)TxBuffer, "%d,02,05,Network Register Success!\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}break;}return sim_flag;
}/********************************************
函数名:SIM800L_CallNum
功  能:拨打指定号码
形  参:*num--手机号码("18977011111")
返回值:无
备  注:无
*********************************************/
void SIM800L_CallNum(uint8_t *Num)
{uint8_t TxBuffer[20];sprintf((char *)TxBuffer, "ATD%s;\r\n", Num);UartPutStr(&huart3, TxBuffer, strlen((char *)TxBuffer));//发给串口3
}/********************************************
函数名:SIM800L_CmdShowOff
功  能:指令不回显
形  参:无
返回值:无
备  注:无
*********************************************/
void SIM800L_CmdShowOff(void)
{uint8_t TxBuffer[10];sprintf((char *)TxBuffer, "ATE0\r\n");UartPutStr(&huart3, TxBuffer, strlen((char *)TxBuffer));//发给串口3
}/********************************************
函数名:SIM800L_SendEN_SMS
功  能:设置TEXT文本模式发送英文短信
形  参:*phone--接收短信的号码  *text--短信内容
返回值:无
备  注:SIM800L_SendEN_SMS(“10086”,“123”)
*********************************************/
void SIM800L_SendEN_SMS(uint8_t *phone, uint8_t *text)
{uint8_t TxBuffer[32];SIM800L_Send_Cmd("AT+CMGF=1", "OK", 10);       //设置文本模式SIM800L_Send_Cmd("AT+CSCS=\"GSM\"", "OK", 10); //设置TE字符集为GSMsprintf((char *)TxBuffer, "AT+CMGS=\"%s\"\r\n", phone);SIM800L_Send_Cmd(TxBuffer, ">", 10);                     //发送短信命令+电话号码UartPutStr(&huart3, text, strlen((char *)text)); //发给串口3,发送短信内容到GSM模块osDelay(1000);                                   //必须增加延时,否则接收方接收信息不全if(SIM800L_Send_Cmd("\x1a\r\n", "+CMGS:", 100) == 0) //发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些){sprintf((char *)TxBuffer, "%d,02,05,SMS Send Success!\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}else{sprintf((char *)TxBuffer, "%d,02,05,SMS Send fail!\r\n", Address);UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试}
}///*********************************************
//函数名:StartGSMTask
//功  能:处理GSM相关功能
//形  参:
//返回值:
//备  注:【GSM】的返回信息到达
//类型码:05
//**********************************************/
//uint8_t SIM800L_Get_text[32];
//void StartGSMTask(void const * argument)
//{//    uint8_t RxBuffer[32], TxBuffer[32];
//    uint16_t len;
//    osDelay(400);
//    /*GSM初始化部分*/
//    sprintf((char *)TxBuffer, "AT\r\n");
//    UartPutStr(&huart3, TxBuffer, strlen((char *)TxBuffer));//初始化GSM模块的波特率,发送任意字符使其自适应
    while(SIM800L_Send_Cmd("AT", "OK", 100)) //检测是否应答AT指令
    {        sprintf((char *)TxBuffer, "未检测到模块!!!\r\n");
        UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试
        osDelay(800);
        sprintf((char *)TxBuffer, "尝试连接模块...\r\n");
        UartPutStr(&huart1, TxBuffer, strlen((char *)TxBuffer));//发给串口1方便调试
        osDelay(400);
    }
//    for(;;)
//    {//        len = UartGetStr(&huart3, RxBuffer); //从串口3读取一次数据
//        if(len > 1)
//        {//            memcpy(SIM800L_Get_text, RxBuffer, strlen((char *)RxBuffer));
//            UartPutStr(&huart1, RxBuffer, len);
//        }//        osMessagePut(QueWdtHandle, 0x08, 10);
//        osDelay(2);
//    }
//}
#ifndef _SIM800L_H
#define _SIM800L_H
#include "main.h"uint8_t* SIM800L_Check_Cmd(uint8_t *str);
uint8_t SIM800L_Send_Cmd(uint8_t *cmd, uint8_t *ack, u16 WaitTime);uint8_t SIM800L_Info_Show(void);
void SIM800L_CallNum(uint8_t *Num);
void SIM800L_CmdShowOff(void);
void SIM800L_SendEN_SMS(uint8_t *phone,uint8_t *text);
#endif

单片机 STM32 HAL GSM通讯 SIM800L相关推荐

  1. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  2. 单片机 STM32 HAL 网络模块 ENC28J60

    文章目录 一. 简介 二.特性 三.示例代码 一. 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器.它可作为任何 ...

  3. 单片机 STM32 HAL PCF8574 例子代码

    #include "extgpio.h" #include "pcf8574.h" #include "74hc595.h" /****** ...

  4. 单片机 STM32 HAL 射频读卡器 RC522

    1.CubeMX 定义任意两个引脚,作为复位脚和片选脚,并对引脚作出如下配置: GPlO output level --High GPIO mode --Output Open Drain GPIO ...

  5. 单片机 STM32 HAL IO扩展 PCA9555

    描述 这个用于两线双向总线(I 2 C)的16位扩展器设计用于2.3V至5.5VV CC 运行.通过I 2 C接口[串行时钟(SCL),串行数据(SDA)],它为大多数微控制器系列产品提供通用远程I ...

  6. 单片机 STM32 HAL 步进电机 Motor

    /*************笔记**************** 1.CubeMX 定义任意四个引脚,作为ABCD相,并对引脚作出如下配置:GPlO output level --HighGPIO m ...

  7. 单片机 STM32 HAL 温湿度 DS18B20

    /*************笔记**************** 1.CubeMX 定义任意一个引脚,作为数据脚,并对引脚作出如下配置:GPlO output level --LOWGPIO mode ...

  8. 单片机 STM32 HAL 液晶屏 LCD16032

    笔记: 1.采用串行输出 2.器件 [16 NC(PSB)]引脚需要接地, H:并口通信 L:串口通信 3.LCD_CS_Pin LCD_CS_GPIO_Port //片选控制,0,无效 1有效 LC ...

  9. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  10. 基于STM32单片机智能手表GSM短信GPS定位设计(毕业设计资料)

    本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成.  1.液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换 ...

最新文章

  1. eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能
  2. Python 获取项目根路径
  3. 基于MATLAB的自由空间损耗模型的理论与仿真
  4. 03-kubeadm初始化Kubernetes集群
  5. 8-10 牛客网刷题知识点集合
  6. PHP程序员的技术成长规划(转)
  7. go genetlink demo
  8. openssh-在win7上的搭建
  9. MySQL入门之视图
  10. python timer 死掉_Python timer定时器两种常用方法解析 Python中如何在一段时间后停止程序...
  11. 【Elasticsearch】Elasticsearch能检索出来,但不能正确高亮怎么办 高亮部分数据 高亮指定字符串 Ngram
  12. mysql1558错误,mysql删除用户错误ERROR 1558解决办法
  13. Selenium 与 Android自动化测试
  14. 算法:两个数之和为目标数Two Sum II - Input array is sorted
  15. 程序员的算法趣题:Q09 落单的男女(Java版)
  16. 隐私全没了?30亿条个人信息被盗,BAT等96家公司全部中招
  17. 初探DirectShow
  18. 白盒测试与黑盒测试--(详解)
  19. 不能正常打开Eclipse闪退的问题
  20. mac os - pptp协议连接

热门文章

  1. syslog (cactiez)
  2. 仓储扫描管理系统服务器价格,仓储条码管理系统解决方案报告书.doc
  3. 计算机辅助设计 Photoshop 教案,计算机辅助设计①Photoshop学习领域课程标准.doc
  4. 基于MATLAB的有源三相滤波器的设计,基于MATLAB的电力系统有源滤波器设计
  5. Matlab入门基础思维导图
  6. 0基础学SQL(三)
  7. 基于FPGA的SRIO核的使用
  8. 零信任在智慧城市典型场景中的融合应用
  9. excel导入自定义单元格式yyyymd hmmss时间方法
  10. JRebel安装、最新激活方式