1. 程式人生 > 其它 >【stm32】基於hal庫使用野火指南者esp8266 WIFI模組進行TCP傳輸

【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\n\r";
    //HAL_UART_Transmit(&huart1,hello,sizeof(hello),0x10);
    HAL_Delay(2000);
    show_Usart3_Message();
    
    char cmd1[]="AT+CWLAP\r\n";
    send_to_Usart3(cmd1);
    HAL_Delay(10000);
    show_Usart3_Message();
    
    char cmd2[]="AT+CWJAP=\"Redmi K30\",\"lpnb6666\"\r\n";
    send_to_Usart3(cmd2);
    HAL_Delay(20000);
    show_Usart3_Message();

    char cmd4[]="AT+CIPMUX=0\r\n";
    send_to_Usart3(cmd4);
    HAL_Delay(3000);
    show_Usart3_Message();
    
    char cmd5[]="AT+CIPMODE=1\r\n";
    send_to_Usart3(cmd5);
    HAL_Delay(3000);
    show_Usart3_Message();
    
    char cmd3[]="AT+CIFSR\r\n";
    send_to_Usart3(cmd3);
    HAL_Delay(3000);
    show_Usart3_Message();

    send_to_Usart3("AT+CIPSTART=\"TCP\",\"192.168.43.193\",8899\r\n");
    HAL_Delay(10000);
    show_Usart3_Message();
    
    send_to_Usart3("AT+CIPSEND\r\n");
    HAL_Delay(3000);
    show_Usart3_Message();
    
    send_to_Usart3(">\r\n");
    HAL_Delay(3000);
    show_Usart3_Message();
    
    send_to_Usart3("lp\r\n");
    HAL_Delay(3000);
    show_Usart3_Message();
    
    send_to_Usart3("123456\r\n");
    HAL_Delay(3000);
    show_Usart3_Message();
    
    send_to_Usart3("hello everyone\r\n");
    HAL_Delay(3000);
    show_Usart3_Message();
    
    send_to_Usart3("+++");
    HAL_Delay(3000);
    show_Usart3_Message();
  while (1)
  {
        send_to_Usart3("AT\r\n");
    HAL_Delay(1000);
        show_Usart3_Message();
  }
  /* USER CODE END 3 */
}

注意事項:

首先,不能連續 發AT+指令,需要等上一個指令處理完再發下一個指令,具體怎麼等可以用AT指令查詢

其次,不能直接用C庫接收,要使用串列埠中斷接收

再次,傳送給esp8266模組的資料要以\r\n結尾,資料透傳用>\r\n開始,用+++結束,其中+++沒有\r\n