返回列表 发新帖

用STM32F407开发板实现4G模块EC200S发送短信功能

[复制链接]

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-6-2 15:33:07 | 显示全部楼层 | 阅读模式
本帖最后由 Mcuzone_TKN 于 2020-6-9 09:19 编辑

关键词:STM32F407 4G模块 EC200S 发送短信 串口 USART AT命令

概述:用stm32f407的串口连接4G模块EC200S通过AT命令实现发送短信的功能。

描述:EC200S的电平是1.8v,STM32F407的电平是3.3v,所以需要通过电平转换模块连接两者,电平转换模块A端的电平要大于B端的电平。测试时,电话号码写在程序里面。

硬件连接:STM32的串口(PA9,PA10)通过电平转换模块连接到EC200S的串口。

(附有测试文件)



串口代码

  1. <font color="black">int fputc(int ch, FILE *f)
  2. {
  3. while((USART1->SR&0x40)==0);
  4. USART1->DR = (u8) ch;
  5. return ch;
  6. }

  7. void USART1_Init(void)
  8. {  
  9.   GPIO_InitTypeDef GPIO_InitStructure;
  10. USART_InitTypeDef USART_InitStructure;
  11. NVIC_InitTypeDef NVIC_InitStructure;
  12.         
  13.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
  14.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟
  15. //串口1对应引脚复用映射
  16.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
  17.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
  18. //USART1端口配置
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHZ
  22.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  23.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉&shy;
  24.         GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10。
  25. //USART1初始化设置
  26.         USART_InitStructure.USART_BaudRate = 115200; //波特率设置
  27.         USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
  28.         USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
  29.         USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
  30.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
  31.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  32.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  33.         
  34.   USART_Cmd(USART1, ENABLE);  //使能串口1
  35.         
  36.         USART_ClearFlag(USART1, USART_FLAG_TC);
  37.         
  38.         #if EN_USART1_RX        
  39.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //开启相关中断

  40. //USART NVIC配置
  41.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
  42.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;  //抢占优先级3
  43.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
  44.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  45.         NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化NVIC寄存器

  46. #endif
  47.         
  48. }

  49. void USART_PutChar(char Data)
  50. {
  51.         USART_SendData(USART1,Data);
  52.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
  53.         {        
  54.         }
  55. }
  56. void USART_PutStr(char *str)
  57. {
  58.         while(0 != *str)
  59.         {
  60.                 USART1->SR;
  61.                 USART_PutChar(*str);
  62.                 str++;
  63.         }
  64. }

  65. void USART1_IRQHandler(void)
  66. {
  67.         u8 Res;
  68.         
  69.         if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //接收中断
  70.         {
  71.                
  72.                 Res =USART_ReceiveData(USART1);  //读取接收到的数据
  73.                                 
  74.                 if((USART_RX_STA&0x8000)==0) //接收未完成
  75.                 {
  76.                         if(USART_RX_STA&0x4000) //接收到了0x0D
  77.                         {
  78.                                 if(Res!=0x0a)USART_RX_STA=0; //接收错误 重新开始
  79.                                 else USART_RX_STA|=0x8000;  //接收完成了
  80.                         }
  81.                         else  //还没有收到0X0D
  82.                         {        
  83.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  84.                                 else
  85.                                 {
  86.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  87.                                         USART_RX_STA++;
  88.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //数据接收错误 重新开始接收
  89.                                 }                 
  90.                         }
  91.                 }                    
  92.   }
  93. }</font>
复制代码
主函数代码
  1. <font color="black">int main(void)
  2. {  
  3.         delay_init(168);   //初始化延时函数
  4.         LED_Init();
  5.         USART1_Init();

  6.         USART_PutStr("AT+CMGF=1\r");
  7.   delay_ms(1000);
  8.   USART_PutStr("AT+CMGS=\"此处改为目标电话号码\"\r");
  9.         delay_ms(1000);
  10.         delay_ms(1000);
  11.         USART_PutStr("\x1A");      //Ctrl+Z
  12.         while(1)
  13.         {
  14.                 delay_ms(1000);
  15.         }
  16.         
  17. }</font>
复制代码





USART_Messages.hex

15.39 KB, 下载次数: 0

测试文件

回复

使用道具 举报

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-6-2 17:25:13 | 显示全部楼层
本帖最后由 Mcuzone_TKN 于 2020-6-2 17:32 编辑

EC200S通过串口与STM32F407开发板连接,因为EC200S是1.8V,STM32F407是3.3V,所以需要通过电平转换芯片来连接两者。
微信图片_20200602172156.jpg
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表