2026-08-10 21:18:36 +08:00
|
|
|
|
#include "uart.h"
|
|
|
|
|
|
#include "network.h"
|
2026-08-22 12:45:11 +08:00
|
|
|
|
#include "log.h"
|
2026-08-12 14:32:03 +08:00
|
|
|
|
#include "hlw8032.h"
|
2026-08-10 21:18:36 +08:00
|
|
|
|
#include <string.h>
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
|
|
|
|
UART_HandleTypeDef huart1;
|
|
|
|
|
|
UART_HandleTypeDef huart2;
|
|
|
|
|
|
UART_HandleTypeDef huart3;
|
|
|
|
|
|
UART_HandleTypeDef huart4;
|
2026-08-12 14:32:03 +08:00
|
|
|
|
UART_HandleTypeDef huart5;
|
2026-08-10 21:18:36 +08:00
|
|
|
|
|
|
|
|
|
|
uint16_t Rx_Len = 0;
|
|
|
|
|
|
uint8_t Rx_Buf[Rx_Max] = {0};
|
|
|
|
|
|
|
|
|
|
|
|
volatile uint8_t uart1_rx_ready = 0;
|
|
|
|
|
|
uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD>UART4 <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD>ս<EFBFBD><D5BD><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD>OTA <20><><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD> */
|
|
|
|
|
|
volatile uint32_t g_uart4_rxcplt_cnt = 0; /* DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
volatile uint32_t g_uart4_ore_cnt = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
|
|
volatile uint8_t uart2_rx_ready = 0;
|
|
|
|
|
|
uint8_t uart2_rx_buf[UART2_RX_BUF_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t uart1_rx_byte = 0;
|
|
|
|
|
|
static uint8_t uart1_cmd_buf[UART1_RX_BUF_SIZE] = {0};
|
|
|
|
|
|
static uint8_t uart1_cmd_index = 0;
|
|
|
|
|
|
static uint32_t uart1_last_rx_tick = 0;
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t uart2_rx_byte = 0;
|
2026-08-22 12:36:25 +08:00
|
|
|
|
volatile uint32_t g_uart2_rx_byte_cnt = 0; /* USART2 <20>ۼ<EFBFBD><DBBC>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>485 <20><><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD> */
|
2026-08-12 14:32:03 +08:00
|
|
|
|
static uint8_t uart5_rx_byte = 0;
|
2026-08-10 21:18:36 +08:00
|
|
|
|
static uint8_t uart2_cmd_buf[UART2_RX_BUF_SIZE] = {0};
|
|
|
|
|
|
static uint8_t uart2_cmd_index = 0;
|
|
|
|
|
|
static uint32_t uart2_last_rx_tick = 0;
|
|
|
|
|
|
|
|
|
|
|
|
#define UART1_CMD_TIMEOUT_MS 100u /* <20><EFBFBD><DEBB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
#define UART2_CMD_TIMEOUT_MS 20u /* 485 <20><><EFBFBD><EFBFBD>֡<EFBFBD>϶̣<CFB6>20ms <20><>Ϊ֡<CEAA><D6A1><EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
|
|
void MX_USART1_UART_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MX_USART2_UART_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
huart2.Instance = USART2;
|
|
|
|
|
|
huart2.Init.BaudRate = 9600;
|
|
|
|
|
|
huart2.Init.WordLength = UART_WORDLENGTH_8B;
|
|
|
|
|
|
huart2.Init.StopBits = UART_STOPBITS_1;
|
|
|
|
|
|
huart2.Init.Parity = UART_PARITY_NONE;
|
|
|
|
|
|
huart2.Init.Mode = UART_MODE_TX_RX;
|
|
|
|
|
|
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
|
|
|
|
|
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
|
|
|
|
|
|
if (HAL_UART_Init(&huart2) != HAL_OK) Error_Handler();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MX_USART3_UART_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
huart3.Instance = USART3;
|
|
|
|
|
|
huart3.Init.BaudRate = 115200; /* <20>ϵ<EFBFBD>Ĭ<EFBFBD><C4AC> 115200<30><30><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cat_connect_network <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6> 921600 */
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* UART4: WiFi ESP-01S ģ<><C4A3> (PC10=TX -> ESP_RXD, PC11=RX <- ESP_TXD)
|
|
|
|
|
|
* <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD>ʼ 115200<EFBFBD><EFBFBD>ESP-01S AT <EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* esp_reset <EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT+UART_DEF <EFBFBD>̶<EFBFBD>Ϊ WIFI_BAUD_TARGET */
|
|
|
|
|
|
void MX_UART4_UART_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
huart4.Instance = UART4;
|
|
|
|
|
|
huart4.Init.BaudRate = 115200;
|
|
|
|
|
|
huart4.Init.WordLength = UART_WORDLENGTH_8B;
|
|
|
|
|
|
huart4.Init.StopBits = UART_STOPBITS_1;
|
|
|
|
|
|
huart4.Init.Parity = UART_PARITY_NONE;
|
|
|
|
|
|
huart4.Init.Mode = UART_MODE_TX_RX;
|
|
|
|
|
|
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
|
|
|
|
|
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
|
|
|
|
|
|
if (HAL_UART_Init(&huart4) != HAL_OK) Error_Handler();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-12 14:32:03 +08:00
|
|
|
|
/* UART5: HLW8032 <20><><EFBFBD><EFBFBD>оƬ (PD2=RX <- оƬ TXD)<29><>4800 8E1<45><31>
|
|
|
|
|
|
* оƬֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>TX(PC12) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ+żУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> F1 <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> 9 λ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
void MX_UART5_UART_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
huart5.Instance = UART5;
|
|
|
|
|
|
huart5.Init.BaudRate = 4800;
|
|
|
|
|
|
huart5.Init.WordLength = UART_WORDLENGTH_9B;
|
|
|
|
|
|
huart5.Init.StopBits = UART_STOPBITS_1;
|
|
|
|
|
|
huart5.Init.Parity = UART_PARITY_EVEN;
|
|
|
|
|
|
huart5.Init.Mode = UART_MODE_RX;
|
|
|
|
|
|
huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
|
|
|
|
|
huart5.Init.OverSampling = UART_OVERSAMPLING_16;
|
|
|
|
|
|
if (HAL_UART_Init(&huart5) != HAL_OK) Error_Handler();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void UART5_StartRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-10 21:18:36 +08:00
|
|
|
|
void USART3_StartRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD> DMA: <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
if (huart3.RxState != HAL_UART_STATE_READY) {
|
|
|
|
|
|
HAL_UART_DMAStop(&huart3);
|
|
|
|
|
|
}
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart3, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ֹͣ USART3 DMA <20><><EFBFBD>գ<EFBFBD>WiFi/4G <20><><EFBFBD>⸴<EFBFBD><E2B8B4> Rx_Buf<75><66><EFBFBD><EFBFBD> WiFi ͨ<><CDA8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ 4G <20><><EFBFBD><EFBFBD> */
|
|
|
|
|
|
void USART3_StopRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
__HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);
|
|
|
|
|
|
HAL_UART_DMAStop(&huart3);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD> UART4 DMA+IDLE <20><><EFBFBD>գ<EFBFBD><D5A3><EFBFBD> USART3 <20><><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB> Rx_Buf<75><66><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC> StartRx/StopRx <20><>֤<EFBFBD><D6A4> */
|
|
|
|
|
|
void UART4_StartRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (huart4.RxState != HAL_UART_STATE_READY) {
|
|
|
|
|
|
HAL_UART_DMAStop(&huart4);
|
|
|
|
|
|
}
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart4, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void UART4_StopRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
__HAL_UART_DISABLE_IT(&huart4, UART_IT_IDLE);
|
|
|
|
|
|
HAL_UART_DMAStop(&huart4);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> UART4 <20><><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ֻ<EFBFBD><D6BB>д BRR <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPIO/NVIC/DMA <20><><EFBFBD>á<EFBFBD>
|
|
|
|
|
|
* UART4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> APB1(36MHz) <EFBFBD><EFBFBD> */
|
|
|
|
|
|
void UART4_SetBaudRate(uint32_t baud)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (huart4.RxState != HAL_UART_STATE_READY) {
|
|
|
|
|
|
HAL_UART_DMAStop(&huart4);
|
|
|
|
|
|
}
|
|
|
|
|
|
huart4.Init.BaudRate = baud;
|
|
|
|
|
|
UART4->BRR = UART_BRR_SAMPLING16(36000000u, baud);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(&huart4);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(&huart4);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(&huart4);
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(&huart4);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart4);
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart4, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* UART <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ORE(<28><><EFBFBD><EFBFBD>) <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HAL <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD> DMA <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
* (stm32f1xx_hal_uart.c: UART_EndRxTransfer + HAL_DMA_Abort_IT)<EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD>˺<EFBFBD>ģ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ա<EFBFBD>
|
|
|
|
|
|
* 921600 <EFBFBD>߲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD> IDLE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* ʱ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD> ORE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ﰴ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (huart->Instance == UART4) {
|
|
|
|
|
|
g_uart4_ore_cnt++;
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
|
|
|
|
huart->ErrorCode = HAL_UART_ERROR_NONE;
|
|
|
|
|
|
if (NET_GetActiveBackend() == NET_BACKEND_WIFI) {
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart4, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (huart->Instance == USART1) {
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
|
|
|
|
huart->ErrorCode = HAL_UART_ERROR_NONE;
|
2026-08-22 11:55:05 +08:00
|
|
|
|
huart1.RxState = HAL_UART_STATE_READY; /* <20>ؼ<EFBFBD><D8BC><EFBFBD>HAL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RxState <20><><EFBFBD><EFBFBD> BUSY_RX<52><58>Receive_IT <20>ᾲĬʧ<C4AC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3> */
|
2026-08-10 21:18:36 +08:00
|
|
|
|
HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1); /* <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD>Կڱ<D4BF> ORE Ū<>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (huart->Instance == USART2) {
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
|
|
|
|
huart->ErrorCode = HAL_UART_ERROR_NONE;
|
2026-08-22 11:55:05 +08:00
|
|
|
|
huart2.RxState = HAL_UART_STATE_READY; /* <20>ؼ<EFBFBD><D8BC><EFBFBD>HAL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RxState <20><><EFBFBD><EFBFBD> BUSY_RX<52><58>Receive_IT <20>ᾲĬʧ<C4AC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3> */
|
2026-08-10 21:18:36 +08:00
|
|
|
|
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); /* RS485 <20>ӿ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
}
|
2026-08-12 14:32:03 +08:00
|
|
|
|
else if (huart->Instance == UART5) {
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
|
|
|
|
huart->ErrorCode = HAL_UART_ERROR_NONE;
|
2026-08-22 11:55:05 +08:00
|
|
|
|
huart5.RxState = HAL_UART_STATE_READY; /* <20>ؼ<EFBFBD><D8BC><EFBFBD>HAL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RxState <20><><EFBFBD><EFBFBD> BUSY_RX<52><58>Receive_IT <20>ᾲĬʧ<C4AC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3> */
|
2026-08-12 14:32:03 +08:00
|
|
|
|
HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1); /* HLW8032 <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
}
|
2026-08-10 21:18:36 +08:00
|
|
|
|
else if (huart->Instance == USART3) {
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(huart);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
|
|
|
|
huart->ErrorCode = HAL_UART_ERROR_NONE;
|
|
|
|
|
|
if (NET_GetActiveBackend() == NET_BACKEND_4G) {
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart3, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> USART3 <20><><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ֻ<EFBFBD><D6BB>д BRR <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPIO/NVIC/DMA <20><><EFBFBD>á<EFBFBD>
|
|
|
|
|
|
* USART3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> APB1(36MHz) <EFBFBD><EFBFBD> */
|
|
|
|
|
|
void USART3_SetBaudRate(uint32_t baud)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (huart3.RxState != HAL_UART_STATE_READY) {
|
|
|
|
|
|
HAL_UART_DMAStop(&huart3);
|
|
|
|
|
|
}
|
|
|
|
|
|
huart3.Init.BaudRate = baud;
|
|
|
|
|
|
USART3->BRR = UART_BRR_SAMPLING16(36000000u, baud);
|
|
|
|
|
|
__HAL_UART_CLEAR_PEFLAG(&huart3);
|
|
|
|
|
|
__HAL_UART_CLEAR_FEFLAG(&huart3);
|
|
|
|
|
|
__HAL_UART_CLEAR_NEFLAG(&huart3);
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(&huart3);
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart3, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void USART1_StartRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uart1_rx_ready = 0;
|
|
|
|
|
|
uart1_cmd_index = 0;
|
|
|
|
|
|
uart1_last_rx_tick = 0;
|
|
|
|
|
|
memset(uart1_cmd_buf, 0, sizeof(uart1_cmd_buf));
|
|
|
|
|
|
memset(uart1_rx_buf, 0, sizeof(uart1_rx_buf));
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void USART2_StartRx(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uart2_rx_ready = 0;
|
|
|
|
|
|
uart2_cmd_index = 0;
|
|
|
|
|
|
uart2_last_rx_tick = 0;
|
|
|
|
|
|
memset(uart2_cmd_buf, 0, sizeof(uart2_cmd_buf));
|
|
|
|
|
|
memset(uart2_rx_buf, 0, sizeof(uart2_rx_buf));
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-22 11:47:38 +08:00
|
|
|
|
/* <20><> USART2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>壨<EFBFBD><E5A3A8><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* 485 <EFBFBD><EFBFBD>ѯǰ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>֡<EFBFBD>Ӹɾ<EFBFBD>״̬<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* ע<EFBFBD>⣺<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AbortReceive/<EFBFBD>ع<EFBFBD><EFBFBD>жϡ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ISR <EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>ع<EFBFBD> + ORE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> */
|
2026-08-22 12:36:25 +08:00
|
|
|
|
uint16_t USART2_GetRxIndex(void) { return uart2_cmd_index; } /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
2026-08-22 11:47:38 +08:00
|
|
|
|
void USART2_FlushRxBuf(void)
|
2026-08-22 10:48:04 +08:00
|
|
|
|
{
|
2026-08-22 12:45:11 +08:00
|
|
|
|
if (uart2_cmd_index > 0) {
|
|
|
|
|
|
char hex[3 * 24 + 1] = {0};
|
|
|
|
|
|
uint16_t n = uart2_cmd_index < 24 ? uart2_cmd_index : 24;
|
|
|
|
|
|
for (uint16_t i = 0; i < n; i++) snprintf(hex + i * 3, 4, "%02X ", uart2_cmd_buf[i]);
|
|
|
|
|
|
log_warn("> UART2: <20>建<EFBFBD>嶪<EFBFBD><E5B6AA> %d <20>ֽ<EFBFBD>: %s", (int)uart2_cmd_index, hex);
|
|
|
|
|
|
}
|
2026-08-22 10:48:04 +08:00
|
|
|
|
uart2_rx_ready = 0;
|
|
|
|
|
|
uart2_cmd_index = 0;
|
2026-08-22 11:55:05 +08:00
|
|
|
|
/* <20><><EFBFBD>ף<EFBFBD><D7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>ʱ<EFBFBD><CAB1>ORE <20><>״̬<D7B4><CCAC> BUSY_RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Abort<72><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
|
|
|
|
|
if (!(USART2->CR1 & USART_CR1_RXNEIE)) {
|
|
|
|
|
|
__HAL_UART_CLEAR_OREFLAG(&huart2);
|
|
|
|
|
|
huart2.ErrorCode = HAL_UART_ERROR_NONE;
|
|
|
|
|
|
huart2.RxState = HAL_UART_STATE_READY;
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
|
|
|
|
|
|
}
|
2026-08-22 10:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-10 21:18:36 +08:00
|
|
|
|
/* <20><> USART2 <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>һ֡<D2BB><D6A1>20ms <20><><EFBFBD><EFBFBD><EFBFBD>ֽڽ<D6BD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ȣ<EFBFBD>0 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡ */
|
|
|
|
|
|
uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (uart2_rx_ready) {
|
|
|
|
|
|
uart2_rx_ready = 0;
|
|
|
|
|
|
uint16_t len = uart2_cmd_index < out_size ? uart2_cmd_index : out_size - 1;
|
|
|
|
|
|
memcpy(out, uart2_cmd_buf, len);
|
|
|
|
|
|
out[len] = '\0';
|
|
|
|
|
|
uart2_cmd_index = 0;
|
|
|
|
|
|
return len;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20>жϽ<D0B6><CFBD>ջص<D5BB><D8B5><EFBFBD><EFBFBD>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EEBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART1_CMD_TIMEOUT_MS <EFBFBD>Զ<EFBFBD><EFBFBD>ύ */
|
|
|
|
|
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (huart->Instance == USART1) {
|
|
|
|
|
|
uint8_t ch = uart1_rx_byte;
|
|
|
|
|
|
if (ch == '\r' || ch == '\n') {
|
|
|
|
|
|
if (uart1_cmd_index > 0) {
|
|
|
|
|
|
uart1_cmd_buf[uart1_cmd_index] = '\0';
|
|
|
|
|
|
memcpy(uart1_rx_buf, uart1_cmd_buf, uart1_cmd_index + 1);
|
|
|
|
|
|
uart1_rx_ready = 1;
|
|
|
|
|
|
uart1_cmd_index = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (uart1_cmd_index < UART1_RX_BUF_SIZE - 1) {
|
|
|
|
|
|
uart1_cmd_buf[uart1_cmd_index++] = ch;
|
|
|
|
|
|
uart1_last_rx_tick = HAL_GetTick();
|
|
|
|
|
|
}
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (huart->Instance == USART2) {
|
|
|
|
|
|
uint8_t ch = uart2_rx_byte;
|
2026-08-22 12:36:25 +08:00
|
|
|
|
g_uart2_rx_byte_cnt++;
|
2026-08-10 21:18:36 +08:00
|
|
|
|
if (uart2_cmd_index < UART2_RX_BUF_SIZE - 1) {
|
|
|
|
|
|
uart2_cmd_buf[uart2_cmd_index++] = ch;
|
|
|
|
|
|
uart2_last_rx_tick = HAL_GetTick();
|
|
|
|
|
|
}
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
|
|
|
|
|
|
}
|
2026-08-12 14:32:03 +08:00
|
|
|
|
else if (huart->Instance == UART5) {
|
|
|
|
|
|
hlw8032_rx_byte(uart5_rx_byte);
|
|
|
|
|
|
HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1);
|
|
|
|
|
|
}
|
2026-08-10 21:18:36 +08:00
|
|
|
|
else if (huart->Instance == UART4) {
|
|
|
|
|
|
/* DMA(NORMAL) <20><><EFBFBD><EFBFBD> Rx_Buf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>п<EFBFBD><D0BF>м<EFBFBD>϶<EFBFBD><CFB6>IDLE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ڣ<EFBFBD>WiFi OTA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD>֣<EFBFBD> */
|
|
|
|
|
|
g_uart4_rxcplt_cnt++;
|
|
|
|
|
|
if (NET_GetActiveBackend() == NET_BACKEND_WIFI &&
|
|
|
|
|
|
(U2_CopyIndex + Rx_Max) < (U2_COPY_SIZE - 1)) {
|
|
|
|
|
|
memcpy(U2_CopyBuff + U2_CopyIndex, Rx_Buf, Rx_Max);
|
|
|
|
|
|
U2_CopyIndex += Rx_Max;
|
|
|
|
|
|
U2_CopyBuff[U2_CopyIndex] = '\0';
|
|
|
|
|
|
U2_CopyFlag = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart4);
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart4, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (huart->Instance == USART3) {
|
|
|
|
|
|
/* ͬ<><CDAC><EFBFBD><EFBFBD>4G <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
if (NET_GetActiveBackend() == NET_BACKEND_4G &&
|
|
|
|
|
|
(U2_CopyIndex + Rx_Max) < (U2_COPY_SIZE - 1)) {
|
|
|
|
|
|
memcpy(U2_CopyBuff + U2_CopyIndex, Rx_Buf, Rx_Max);
|
|
|
|
|
|
U2_CopyIndex += Rx_Max;
|
|
|
|
|
|
U2_CopyBuff[U2_CopyIndex] = '\0';
|
|
|
|
|
|
U2_CopyFlag = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
|
|
|
|
|
|
HAL_UART_Receive_DMA(&huart3, Rx_Buf, Rx_Max);
|
|
|
|
|
|
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-22 13:06:50 +08:00
|
|
|
|
/* ԭ<><D4AD>ȡ֡<C8A1><D6A1>20ms <20><>Ĭ<EFBFBD><C4AC>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> <20><> ֱ<>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>建<EFBFBD>壬һ<E5A3AC><D2BB><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD> Tick(<EFBFBD>ñ<EFBFBD>־)+GetFrame(ȡ֡) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>䱻<EFBFBD><EFBFBD>ѯ/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD>建<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ᶪ֡<EFBFBD><EFBFBD>485 <EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
uint16_t USART2_PollFrame(uint8_t *out, uint16_t out_size)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (uart2_cmd_index > 0 &&
|
|
|
|
|
|
(HAL_GetTick() - uart2_last_rx_tick) > UART2_CMD_TIMEOUT_MS) {
|
|
|
|
|
|
/* <20><><EFBFBD>ϣ<EFBFBD>֡<EFBFBD>ύʱ<E1BDBB><CAB1>ӡ<EFBFBD><D3A1><EFBFBD>ݣ<EFBFBD>485 <20><>֡<EFBFBD><D6A1>λ<EFBFBD><CEBB> */
|
|
|
|
|
|
char hex[3 * 24 + 1] = {0};
|
|
|
|
|
|
uint16_t n0 = uart2_cmd_index < 24 ? uart2_cmd_index : 24;
|
|
|
|
|
|
for (uint16_t i = 0; i < n0; i++) snprintf(hex + i * 3, 4, "%02X ", uart2_cmd_buf[i]);
|
|
|
|
|
|
log_info("> UART2: ֡<>ύ %d <20>ֽ<EFBFBD>: %s", (int)uart2_cmd_index, hex);
|
|
|
|
|
|
uint16_t len = uart2_cmd_index < out_size ? uart2_cmd_index : out_size - 1;
|
|
|
|
|
|
memcpy(out, uart2_cmd_buf, len);
|
|
|
|
|
|
out[len] = 0;
|
|
|
|
|
|
uart2_cmd_index = 0;
|
|
|
|
|
|
uart2_rx_ready = 0;
|
|
|
|
|
|
return len;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-10 21:18:36 +08:00
|
|
|
|
/* <20><> USART2_GetFrame <20><><EFBFBD><EFBFBD>ѯǰ<D1AF><C7B0>20ms <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>Զ<EFBFBD><D4B6>ύ֡ */
|
|
|
|
|
|
void USART2_Tick(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (uart2_cmd_index > 0 &&
|
|
|
|
|
|
(HAL_GetTick() - uart2_last_rx_tick) > UART2_CMD_TIMEOUT_MS) {
|
2026-08-22 12:45:11 +08:00
|
|
|
|
/* <20><><EFBFBD>ϣ<EFBFBD>֡<EFBFBD>ύʱ<E1BDBB><CAB1>ӡ<EFBFBD><D3A1><EFBFBD>ݣ<EFBFBD>485 <20><>֡<EFBFBD><D6A1>λ<EFBFBD><CEBB> */
|
|
|
|
|
|
char hex[3 * 24 + 1] = {0};
|
|
|
|
|
|
uint16_t n = uart2_cmd_index < 24 ? uart2_cmd_index : 24;
|
|
|
|
|
|
for (uint16_t i = 0; i < n; i++) snprintf(hex + i * 3, 4, "%02X ", uart2_cmd_buf[i]);
|
|
|
|
|
|
log_info("> UART2: ֡<>ύ %d <20>ֽ<EFBFBD>: %s", (int)uart2_cmd_index, hex);
|
2026-08-10 21:18:36 +08:00
|
|
|
|
uart2_rx_ready = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>Сд<D0A1><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƚ<EFBFBD> */
|
|
|
|
|
|
static int uart_strcasecmp(const char *a, const char *b)
|
|
|
|
|
|
{
|
|
|
|
|
|
while (*a && *b) {
|
|
|
|
|
|
char ca = (char)toupper((unsigned char)*a);
|
|
|
|
|
|
char cb = (char)toupper((unsigned char)*b);
|
|
|
|
|
|
if (ca != cb) return ca - cb;
|
|
|
|
|
|
a++;
|
|
|
|
|
|
b++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return (char)toupper((unsigned char)*a) - (char)toupper((unsigned char)*b);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD> USART1 <20>Ƿ<EFBFBD><C7B7>յ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3A8><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>Сд<D0A1><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ready */
|
|
|
|
|
|
int USART1_CheckCommand(const char *cmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
const char *got = USART1_GetCommand();
|
|
|
|
|
|
if (!got) return 0;
|
|
|
|
|
|
return (uart_strcasecmp(got, cmd) == 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* ֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD> \r/\n <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 100ms <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
const char *USART1_GetCommand(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (uart1_rx_ready) {
|
|
|
|
|
|
uart1_rx_ready = 0;
|
|
|
|
|
|
return (const char *)uart1_rx_buf;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (uart1_cmd_index > 0 &&
|
|
|
|
|
|
(HAL_GetTick() - uart1_last_rx_tick) > UART1_CMD_TIMEOUT_MS) {
|
|
|
|
|
|
uart1_cmd_buf[uart1_cmd_index] = '\0';
|
|
|
|
|
|
memcpy(uart1_rx_buf, uart1_cmd_buf, uart1_cmd_index + 1);
|
|
|
|
|
|
uart1_cmd_index = 0;
|
|
|
|
|
|
return (const char *)uart1_rx_buf;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|