• 【stm32】基于hal库使用野火指南者esp8266 WIFI模块进行TCP传输


    UART.c

    #include "stm32f1xx_it.h"
    #include "LED.h"
    #include "UART.h"
    #include "string.h"
    
    UART_HandleTypeDef huart1;
    UART_HandleTypeDef huart3;
     
    #define RXBUFFERSIZE  4096         //最大接收字节数
    
    char RxBuffer1[RXBUFFERSIZE];   //接收数据
    uint8_t aRxBuffer1;                            //接收中断缓冲
    uint32_t Uart1_Rx_Cnt = 0;                //接收缓冲计数
    
    char RxBuffer3[RXBUFFERSIZE];   //接收数据
    uint8_t aRxBuffer3;                            //接收中断缓冲
    uint32_t Uart3_Rx_Cnt = 0;                //接收缓冲计数
    
    /**
      * @brief USART1 Initialization Function
      * @param None
      * @retval None
      */
    void MX_USART1_UART_Init(void){
      /* USER CODE BEGIN USART1_Init 0 */
    
      /* USER CODE END USART1_Init 0 */
    
      /* USER CODE BEGIN USART1_Init 1 */
    
      /* USER CODE END USART1_Init 1 */
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN USART1_Init 2 */
        HAL_UART_MspInit(&huart1);
        HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer1, 1);   //开启接收中断
      /* USER CODE END USART1_Init 2 */
    }
    
    /**
      * @brief USART3 Initialization Function
      * @param None
      * @retval None
      */
    void MX_USART3_UART_Init(void)
    {
      /* USER CODE BEGIN USART3_Init 0 */
    
      /* USER CODE END USART3_Init 0 */
    
      /* USER CODE BEGIN USART3_Init 1 */
    
      /* USER CODE END USART3_Init 1 */
      huart3.Instance = USART3;
      huart3.Init.BaudRate = 115200;
      huart3.Init.WordLength = UART_WORDLENGTH_8B;
      huart3.Init.StopBits = UART_STOPBITS_1;
      huart3.Init.Parity = UART_PARITY_NONE;
      huart3.Init.Mode = UART_MODE_TX_RX;
      huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart3.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart3) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN USART3_Init 2 */
        HAL_UART_MspInit(&huart3);
        HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer3, 1);   //再开启接收中断
      /* USER CODE END USART3_Init 2 */
    }
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1){}
      /* USER CODE END Error_Handler_Debug */
    }
    
    void send_to_Usart3(char * cmd){
        HAL_UART_Transmit(&huart3, (uint8_t *)cmd,strlen(cmd),0xFFFF); 
        while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
    }
    
    void show_Usart3_Message(){
        HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer3, Uart3_Rx_Cnt,0xFFFF); //将收到的信息发送出去
        while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
        Uart3_Rx_Cnt = 0;
        memset(RxBuffer3,0x00,sizeof(RxBuffer3)); //清空数组
    }
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
        if(huart->Instance==USART1){
            if(Uart1_Rx_Cnt >= (RXBUFFERSIZE-1)){  //溢出判断
                Uart1_Rx_Cnt = 0;
                memset(RxBuffer1,0x00,sizeof(RxBuffer1));
                HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);     
            }else{
                RxBuffer1[Uart1_Rx_Cnt++] = aRxBuffer1;   //接收数据转存
                //HAL_UART_Transmit(&huart3, (uint8_t *)test, sizeof(test),0xFFFF);
                
                /*
                if((RxBuffer1[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer1[Uart1_Rx_Cnt-2] == 0x0D)){ //判断结束位
                    HAL_UART_Transmit(&huart3, (uint8_t *)&RxBuffer1, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                    while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
                    Uart1_Rx_Cnt = 0;
                    memset(RxBuffer1,0x00,sizeof(RxBuffer1)); //清空数组
                }
                */
            }
            HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer1, 1);   //再开启接收中断
        }
        if(huart->Instance==USART3){
            if(Uart3_Rx_Cnt >= (RXBUFFERSIZE-1)){  //溢出判断
                Uart3_Rx_Cnt = 0;
                memset(RxBuffer3,0x00,sizeof(RxBuffer3));
                HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);     
            }else{
                RxBuffer3[Uart3_Rx_Cnt++] = aRxBuffer3;   //接收数据转存
                /*
                if(((RxBuffer3[Uart3_Rx_Cnt-1] == 0x0A)&&(RxBuffer3[Uart3_Rx_Cnt-2] == 0x0D))){ //判断结束位
                    HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer3, Uart3_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                    while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
                    Uart3_Rx_Cnt = 0;
                    memset(RxBuffer3,0x00,sizeof(RxBuffer3)); //清空数组
                }
                */
            }
            HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer3, 1);   //再开启接收中断
        }
    }
    
    //重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
    int fputc(int ch, FILE *f){
        /* 发送一个字节数据到串口DEBUG_USART */
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);    
        return (ch);
    }

    main.c

    /**
      * @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_USART3_UART_Init();
      /* USER CODE BEGIN 2 */
        LED_GPIO_Config();
        esp8266_Init();
      /* USER CODE END 2 */
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
        //unsigned char hello[]="hello
    
    ";
        //HAL_UART_Transmit(&huart1,hello,sizeof(hello),0x10);
        HAL_Delay(2000);
        show_Usart3_Message();
        
        char cmd1[]="AT+CWLAP
    ";
        send_to_Usart3(cmd1);
        HAL_Delay(10000);
        show_Usart3_Message();
        
        char cmd2[]="AT+CWJAP="Redmi K30","lpnb6666"
    ";
        send_to_Usart3(cmd2);
        HAL_Delay(20000);
        show_Usart3_Message();
    
        char cmd4[]="AT+CIPMUX=0
    ";
        send_to_Usart3(cmd4);
        HAL_Delay(3000);
        show_Usart3_Message();
        
        char cmd5[]="AT+CIPMODE=1
    ";
        send_to_Usart3(cmd5);
        HAL_Delay(3000);
        show_Usart3_Message();
        
        char cmd3[]="AT+CIFSR
    ";
        send_to_Usart3(cmd3);
        HAL_Delay(3000);
        show_Usart3_Message();
    
        send_to_Usart3("AT+CIPSTART="TCP","192.168.43.193",8899
    ");
        HAL_Delay(10000);
        show_Usart3_Message();
        
        send_to_Usart3("AT+CIPSEND
    ");
        HAL_Delay(3000);
        show_Usart3_Message();
        
        send_to_Usart3(">
    ");
        HAL_Delay(3000);
        show_Usart3_Message();
        
        send_to_Usart3("lp
    ");
        HAL_Delay(3000);
        show_Usart3_Message();
        
        send_to_Usart3("123456
    ");
        HAL_Delay(3000);
        show_Usart3_Message();
        
        send_to_Usart3("hello everyone
    ");
        HAL_Delay(3000);
        show_Usart3_Message();
        
        send_to_Usart3("+++");
        HAL_Delay(3000);
        show_Usart3_Message();
      while (1)
      {
            send_to_Usart3("AT
    ");
        HAL_Delay(1000);
            show_Usart3_Message();
      }
      /* USER CODE END 3 */
    }

    注意事项:

    首先,不能连续 发AT+指令,需要等上一个指令处理完再发下一个指令,具体怎么等可以用AT指令查询

    其次,不能直接用C库接收,要使用串口中断接收

    再次,发送给esp8266模块的数据要以 结尾,数据透传用> 开始,用+++结束,其中+++没有

  • 相关阅读:
    python之九九乘法表
    python之生成随机密码
    selenium以及浏览器驱动下载安装
    Monkey命令
    Android SDK Manager仅有一个版本的问题
    截图工具无法使用解决方法
    jmeter服务器监控插件指标简单说明
    mysql字符集小结
    mysql创建新的用户及flush privileges解析
    MySql添加远程超级管理员用户
  • 原文地址:https://www.cnblogs.com/LPworld/p/15003451.html
Copyright © 2020-2023  润新知