瀏覽代碼

update details

terry 2 年之前
父節點
當前提交
f716948505

+ 1 - 1
Core/Inc/main.h

@@ -47,7 +47,7 @@ extern "C" {
 
 /* Exported macro ------------------------------------------------------------*/
 /* USER CODE BEGIN EM */
-extern uint8_t receive_buffer[100];  // 定义接收缓存,这里假设最多可以接收100个字节
+extern uint8_t receive_buffer[30];  // 定义接收缓存,这里假设最多可以接收100个字节
 extern uint8_t flag ;
 
 extern uint16_t Adc2_CalibrationValue ;

+ 20 - 17
Core/Src/gpio.c

@@ -73,28 +73,31 @@ void MX_GPIO_Init(void)
 }
 
 /* USER CODE BEGIN 2 */
-GPIO_TypeDef* GPIO_PORT[8] = {GPIOA, GPIOA, GPIOA, GPIOA, GPIOA, GPIOA, GPIOA, GPIOA};
-const uint16_t GPIO_PIN[8] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};
+typedef struct {
+    GPIO_TypeDef* port;
+    uint16_t pin;
+} GPIO_Pin_t;
+const GPIO_Pin_t GPIO_PINS[8] = {
+    {GPIOA, GPIO_PIN_0},
+    {GPIOA, GPIO_PIN_1},
+    {GPIOA, GPIO_PIN_2},
+    {GPIOA, GPIO_PIN_3},
+    {GPIOA, GPIO_PIN_4},
+    {GPIOA, GPIO_PIN_5},
+    {GPIOA, GPIO_PIN_6},
+    {GPIOA, GPIO_PIN_7}
+};
 uint8_t GetPaInputStatus(void)
 {
-    uint8_t input[8] = {0};
-    uint8_t i, j;
-    for (i = 0; i < 8; i++) {
+    uint8_t input = 0;
+    for (uint8_t i = 0; i < 8; i++) {
         uint16_t count = 0;
-        for (j = 0; j < DEBOUNCE_COUNT; j++) {
-            if (HAL_GPIO_ReadPin(GPIO_PORT[i], GPIO_PIN[i]) == GPIO_PIN_RESET) {
-                count++;
-            }
+        for (uint8_t j = 0; j < DEBOUNCE_COUNT; j++) {
+            count += HAL_GPIO_ReadPin(GPIO_PINS[i].port, GPIO_PINS[i].pin) == GPIO_PIN_RESET;
         }
-        if (count > DEBOUNCE_COUNT / 2) {
-            input[i] = 1;
-        }
-    }
-    uint8_t result = 0;
-    for (i = 0; i < 8; i++) {
-        result |= input[i] << i;
+        input |= ((count > DEBOUNCE_COUNT / 2) << i);
     }
-    return result;
+    return input;
 }
 
 uint8_t GetPbOutputStatus(void)

+ 178 - 51
Core/Src/main.c

@@ -52,10 +52,10 @@ int fputc(int ch, FILE *f)
 /* Private variables ---------------------------------------------------------*/
 
 /* USER CODE BEGIN PV */
-uint8_t data_to_send[100];
+uint8_t data_to_send[50];
 uint16_t CRC_value = 0;
 uint16_t initial_address = 0x00C1;
-uint32_t System_version  = 0x23051100;
+uint32_t System_version  = 0x23051600;
 uint16_t BaudrateValue = 0x0000;
 uint16_t Adc2_CalibrationValue ;
 uint16_t Adc3_CalibrationValue ;
@@ -116,9 +116,9 @@ int main(void)
   /* USER CODE BEGIN WHILE */
   while (1)
   {
+		C1:
 		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
 		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
-
 #if Modbus
     gpioaStatus = GetPaInputStatus();
     gpiobStatus = GetPbOutputStatus();
@@ -134,13 +134,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						}
+						goto C1;
         }
 
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -152,13 +158,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -170,13 +182,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x04 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -188,13 +206,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x05 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -206,13 +230,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x0A && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -228,13 +258,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x0B && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x01){
@@ -250,13 +286,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xAA && receive_buffer[4] == 0x00 ){
@@ -270,13 +312,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xBB && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02){
@@ -290,16 +338,23 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,7);
             data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 11);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xCC && receive_buffer[4] == 0xA5 && receive_buffer[5] == 0x5A){
+						memset(receive_buffer,0,sizeof(receive_buffer));
             HAL_NVIC_SystemReset();
             flag = 0; // 将标志位重新置为0
         }
@@ -316,13 +371,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
@@ -336,13 +397,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,7);
             data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 11);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
@@ -358,13 +425,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,9);
             data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 14);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x04 ){
@@ -386,9 +459,15 @@ int main(void)
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}			
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x01 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x05 ){
@@ -412,9 +491,15 @@ int main(void)
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
@@ -428,13 +513,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,7);
             data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 11);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
@@ -450,13 +541,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,9);
             data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 14);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x02 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x04 ){
@@ -478,9 +575,15 @@ int main(void)
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
@@ -494,13 +597,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,7);
             data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 11);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x03 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x03 ){
@@ -516,13 +625,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,9);
             data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[10] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 14);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x04 && receive_buffer[4] == 0x00 && receive_buffer[5] == 0x02 ){
@@ -536,13 +651,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,7);
             data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[8] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 11);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == (uint8_t)initial_address && receive_buffer[1] == 0x06 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0x0C && receive_buffer[4] == 0x00 ){
@@ -558,13 +679,19 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,6);
             data_to_send[6] = (uint8_t)(CRC_value & 0xFF);
             data_to_send[7] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 8, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 8, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}				
+						goto C1;
         }
         
         else if(receive_buffer[0] == 0xFA && receive_buffer[1] == 0x03 && receive_buffer[2] == 0x00 && receive_buffer[3] == 0xAA && receive_buffer[4] == 0x00  && receive_buffer[5] == 0x01 ){
@@ -576,24 +703,24 @@ int main(void)
             CRC_value = calculate_crc(data_to_send,5);
             data_to_send[5] = (uint8_t)(CRC_value & 0xFF); 
             data_to_send[6] = (uint8_t)(CRC_value >> 8);
-						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 9);
+						HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 15);
 						if (status == HAL_OK) {
 								// 发送成功
 								flag = 0; // 将标志位重新置为0
+								memset(receive_buffer,0,sizeof(receive_buffer));
+								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 						} else {
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+								__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+								memset(receive_buffer,0,sizeof(receive_buffer));
 								HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
-						}
+						}					
+						goto C1;
         }
-				
-		memset(receive_buffer,0,sizeof(receive_buffer));
-		read_new_address_from_flash(ADDR_FLASH_PAGE_61); 
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
     }
-
-    HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
+		HAL_UART_Receive_IT(&huart1, &receive_buffer[0], 8);
 		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
-		HAL_Delay(1);
+		HAL_Delay(1);  
 		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
 
 		#endif

+ 4 - 1
Core/Src/stm32f1xx_it.c

@@ -44,7 +44,7 @@
 
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE BEGIN PV */
-uint8_t receive_buffer[100];  // 定义接收缓存,这里假设最多可以接收100个字节
+uint8_t receive_buffer[30];  // 定义接收缓存,这里假设最多可以接收100个字节
 uint8_t flag = 0;
 
 uint8_t gpioaStatus = 0;
@@ -246,7 +246,10 @@ void USART1_IRQHandler(void)
     {
         __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
         __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
+				memset(receive_buffer,0,sizeof(receive_buffer));
         index = 0; // 重新开始接收数据
+			
+			  read_new_address_from_flash(ADDR_FLASH_PAGE_61); 
         HAL_UART_Receive_IT(&huart1, receive_buffer, 1); // 重新开启串口接收中断
     }
 

+ 5 - 5
Core/Src/usart.c

@@ -217,15 +217,15 @@ void update_baudrate(uint16_t temp) {
         change_baudrate(9600);
     }
 }
+
 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
 {
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
-		
+    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); // 清除接收中断标志位
+    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE); // 清除接收溢出标志位
 }
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 {
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除接收溢出标志位
-		__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除接收中断标志位
+    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE); // 清除接收中断标志位
+    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE); // 清除接收溢出标志位
 }
 /* USER CODE END 1 */

二進制
Doc/新版采集通讯模块的软件设计概要性方案.pdf


File diff suppressed because it is too large
+ 28 - 28
MDK-ARM/iocollect.uvguix.terry


+ 1 - 1
MDK-ARM/iocollect.uvoptx

@@ -140,7 +140,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U69618568 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM)</Name>
+          <Name>-U69618568 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>

+ 1 - 1
MDK-ARM/iocollect.uvprojx

@@ -314,7 +314,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>2</Optim>
+            <Optim>1</Optim>
             <oTime>0</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>

+ 1 - 0
readme.md

@@ -11,4 +11,5 @@
 ######<u>Updated on May 5, 2023 at 13:32</u>
 #####Add View Device Address; 
 #####Software modification baud rate; 
+[http://192.168.0.139:3000/xuy](http://192.168.0.139:3000/xuy)