STM32与串口屏USART HMI交互详解

STM32与串口屏交互(USART HMI)

文章目录

  • 前言
  • 一、前期准备
  • 二.关于在上位机USART HMI里面的一些配置
  • 三.stm32的代码部分
  • 总结

  • 前言

    最近大创和嵌入式比赛都使用到了串口屏,刚开始学习也没什么头绪,后来瞎搞搞就能用了,但是我设计的非常简单,还有很多需要优化的地方,后面我会将代码发出来。为什么我要用串口屏呢?串口屏综合了以上屏幕的特点,即尺寸大、管脚少,能够充分减少占用单片机的I/O资源,且支持触摸。串口屏可作为输出设备(显示)以及输入设备(按键),开发难度小,操作简单,软件要求低且拥有专门的上位机辅助开发,重点是:看着牛


    一、前期准备

    界面设计就不多做叙述,我直接写关于stm32与串口屏交互的部分

    二.关于在上位机USART HMI里面的一些配置

    1.首先是在program.s里面定义一个全局变量的标志位

    2.我这边使用的是双态按钮,只有0和1两个值,通过按下后的值向单片机发送一个值,这里是使用了prints函数直接通过串口来发送的
    到这里串口屏上位机代码的部分就写完了,我写的很简单,也没个帧头帧尾的,大家可以加上。

    三.stm32的代码部分

    关于单片机的代码部分,我是用的是stm32f407zgt6的最小系统板,这里必须注意下,最小系统板和核心板要 避免使用串口1,因为下载程序的时候会占用(PA9 PA10)这两个引脚,所以这个问题困扰了我很久,后来突然想到这件事情,我换成串口2就正常了**

    下面是代码展示

    #include "tjc.h"
    #include <stdarg.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdarg.h>
    
    ///*
    //* 描述: HAL库实现多串口使用printf输出
    //* 参数: huart:对应的串口结构体
    //* 返回: 无*/
    void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)
    {
      char buf[512]; //定义临时数组,根据实际发送大小微调
    
      va_list args;
      va_start(args, format);
      uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, args);
      va_end(args);
      HAL_UART_Transmit(huart,(u8 *)buf,len,1000);
    }
    
    
    #ifndef __TJC_H
    #define __TJC_H
    
    #include "stm32f4xx_hal.h"
    
    #define u8 uint8_t
    #define u16 uint16_t
    #define u32 uint32_t
    #define u64 uint64_t
    typedef __IO uint32_t  vu32;
    typedef __IO uint16_t vu16;
    typedef __IO uint8_t  vu8;
    extern void HAL_Delay_us(uint32_t nus);
    
    void Uart_printf(UART_HandleTypeDef *huart,char *format, ...);
    
    #endif
    
    /* USER CODE BEGIN PV */
    uint8_t cmd;
    uint8_t flag=0;
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
      
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	
    	if(huart->Instance == USART2){
    		switch(cmd)
    		{
    			case 0x01:
    				flag=1;
    			break;
    			case 0x02:
    				flag=2;
    			break;
    		}
    		HAL_UART_Receive_IT(&huart2, &cmd, 1);
    	
    	}
    }
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART1_UART_Init();
      MX_TIM1_Init();
      MX_USART2_UART_Init();
      MX_ADC1_Init();
      MX_TIM3_Init();
      /* USER CODE BEGIN 2 */
      HAL_UART_Receive_IT(&huart2, &cmd, 1);
      
      DHT11_Strat();					//开始启用DHT11
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    
    	  DHT11_Read_Data(&temperature , &humidity);   //读取dht11温湿度传感器
    	  MQ2_Read_Data();							//读取mq2烟雾传感器
    	  
    	  Uart_printf(&huart2,"page1.n0.val=%d\xff\xff\xff",temperature);//串口屏实时显示温度	
    	  Uart_printf(&huart2,"page1.n1.val=%d\xff\xff\xff",humidity);//串口屏实时显示湿度	  
    	  Uart_printf(&huart2,"page1.n2.val=%d\xff\xff\xff",(int)ppm);//串口屏实时显示烟雾浓度	 
    	  
    	  if(flag==1)						//串口接收中断接收到串口屏发来的数据,点亮小灯
    	  {
    		HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
    	  }
    	  else if(flag==2)					//串口接收中断接收到串口屏发来的数据,熄灭小灯
    	  {
    		HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
    	  }
    	 
    	  HAL_Delay(800);
    	  
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    

    总结

    提醒有可能踩雷的地方:
    1.串口屏与stm32接线错误
    2.最小系统板和核心板避免使用串口1(亲自踩过坑)

    作者:小xuuuuuuu

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32与串口屏USART HMI交互详解

    发表回复