From 6c7b6c910be1dcdc0bb786e02be648b1a56faa5e Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Thu, 09 Oct 2025 00:50:02 +0800 Subject: [PATCH] 添加串口远程控制项目代码 --- Core/Src/main.c | 103 +++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 91 insertions(+), 12 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 3344439..91e9187 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -26,9 +26,11 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include <string.h> #include "miscdev.h" #include "sht20.h" #include "w25q.h" +#include "core_json.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -60,7 +62,68 @@ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ +uint8_t g_rxch; /* HAL_UART_Receive_IT() receive 1 byte buffer */ +uint8_t g_rxbuf[256]; /* UART1 receive data buffer */ +uint8_t g_rxbytes; /* UART1 receive data bytes */ +uint32_t g_rxTick; +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + if( huart == &huart1 ) + { + /* clear buffer if it's full */ + if( g_rxbytes >= sizeof(g_rxbuf) ) + g_rxbytes = 0; + + /* Receive a byte data by interrupter */ + HAL_UART_Receive_IT(huart, &g_rxch, 1); + + /* Put this data into receive buffer */ + g_rxbuf[g_rxbytes++] = g_rxch; + + /* Get current receive data tick */ + g_rxTick = HAL_GetTick(); + } +} + +/* parser and control the Leds and relay */ +int parser_command(char *json_str) +{ + const char *fields[] = {"RedLed", "GreenLed", "BlueLed", "Relay"}; + char *value; + size_t value_len = 0; + int status; + + if (JSON_Validate(json_str, strlen(json_str) ) != JSONSuccess) + { + printf("Invalid JSON: %s\r\n", json_str); + return -1; + } + + for (int i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) + { + if (JSONSuccess == JSON_Search(json_str, strlen(json_str), fields[i], strlen(fields[i]), &value, &value_len)) + { + if ( !strncasecmp(value, "On", value_len) ) + status = 1; + + else if ( !strncasecmp(value, "Off", value_len) ) + status = 0; + + if ( !strcmp(fields[i], "RedLed") ) { + turn_led(Led_R, status); + } else if ( !strcmp(fields[i], "GreenLed") ) { + turn_led(Led_G, status); + } else if ( !strcmp(fields[i], "BlueLed") ) { + turn_led(Led_B, status); + } else if ( !strcmp(fields[i], "Relay") ) { + turn_relay(Relay1, status); + } + } + } + + return 0; +} /* USER CODE END 0 */ /** @@ -73,6 +136,7 @@ /* USER CODE BEGIN 1 */ int rv; float temperature, humidity; + char pack_buf[128]; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ @@ -101,25 +165,40 @@ /* USER CODE BEGIN 2 */ beep_start(2, 300); - spinor_test(); + /* Must Enable UART3 receive interrupter here */ + HAL_UART_Receive_IT(&huart1 , &g_rxch, 1); - do {} while(1); + printf("Remote monitor and control program\r\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { - rv = sht20_sample_TrH(&temperature, &humidity); - if( rv ) - { - printf("ERROR: SHT20 sample data failure, rv=%d\r\n", rv); - } - else - { - printf("SHT20 sample temperature: %.2f relative humidity: %.1f%%\r\n", temperature, humidity); - } - HAL_Delay(1000); + const uint32_t sample_interval = 5000; /* sample interval time 5000ms */ + static uint32_t last_tick = 0; /* last sample time */ + + /* check sample time arrive and start report */ + if ((HAL_GetTick() - last_tick) >= sample_interval) + { + rv = sht20_sample_TrH(&temperature, &humidity); + if( !rv ) + { + last_tick = HAL_GetTick(); + + memset(pack_buf, 0, sizeof(pack_buf)); + snprintf(pack_buf, sizeof(pack_buf), "{\"Temperature\":\"%.02f\", \"Humidity\":\"%.02f\"}\r\n", temperature, humidity); + HAL_UART_Transmit(&huart1, (uint8_t *)pack_buf, strlen(pack_buf), 0xFFFF); + } + } + + /* UART receive data and receive over */ + if( g_rxbytes > 0 && (HAL_GetTick()-g_rxTick)>=2) + { + parser_command((char *)g_rxbuf); + memset(g_rxbuf, 0, sizeof(g_rxbuf)); + g_rxbytes = 0; + } /* USER CODE END WHILE */ -- Gitblit v1.9.1