【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模块的数据要以 结尾,数据透传用> 开始,用+++结束,其中+++没有

原文地址:https://www.cnblogs.com/LPworld/p/15003451.html