<<main.c>>
串口数据接收,过长、过短、指令错误都返回超时1s后错误信息,
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>© Copyright (c) 2021 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h"
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <math.h> #include "string.h" #include "gpio.h" #include "usart.h" #include "tim.h" #include "delay.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */ uint8_t UART_Buffer[1]; //串口临时接收 uint8_t UART_Send[UART_BUFFERSIZE]; //串口数据发送 uint8_t Recv_data[UART_BUFFERSIZE]; //串口数据接收 uint8_t UART_SUM; //串口数据和校验计算 uint8_t UART_Num = 0; uint8_t UART_Receive_Flag = 0; //串口接收状态,默认为0等待上位机发送命令
uint16_t TIM6_timer_count = 0; //定时器6计数标记 uint16_t TIM7_timer_count = 0; //定时器7计数标记 uint8_t TIM6_timerFalg = 0; //定时器6 1s标记 uint8_t TIM7_timerFalg = 0; //定时器7 1s标记
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void);
/* USER CODE BEGIN PFP */ uint8_t messageFeedBack(uint8_t addr); //串口1s反馈信息 uint8_t UART_messageSend(void); //串口信息反馈
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/** * @brief The application entry point. * @retval int */ int main(void) { //相关外设初始化 /* USER CODE END 2 */
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { //串口收发检测、上报错误信息 UART_messageSend(); /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }
/* USER CODE BEGIN 4 */ uint8_t UART_messageSend(void) { if(TIM7_timerFalg == 1) //串口信息接收超时1s,判为错误 { TIM7_timerFalg = 0; HAL_TIM_Base_Stop_IT(&htim7);
if(UART_Num < 45) { UART_Num = 0;
for(int i = 0; i < UART_BUFFERSIZE; i++) //清零 { Recv_data[i] = 0; }
UART_Receive_Flag = 0; //串口接收出错 UART_SUM = 0;
//串口上报的错误信息 HAL_UART_Transmit(&huart1, UART_Send, 5, 1000); } }
if(UART_Num > 45) //大于45个字节重新记数 { UART_Num = 0; }
if(get_WOLRD2ARM_BUF_RX_Value == 1 & UART_Receive_Flag == 1) //WOLRD2ARM_BUF_RX引脚拉高、串口接收成功才发送反馈 // if(UART_Receive_Flag == 1) { if(TIM6_timerFalg == 1) //1s反馈一次 { TIM6_timerFalg = 0; messageFeedBack(deviceAddress_Value); } }
return 0; }
uint8_t messageFeedBack(uint8_t addr) { //定时上报数据 }
/** * 函数功能: 串口接收完成回调函数 * 输入参数: UartHandle:USART设备类型句柄 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef* UartHandle) { //触发中断后,串口每次接收的字节数为1 if(HAL_OK == HAL_UART_Receive_IT(&huart1, (uint8_t*)UART_Buffer, 1)) { Recv_data[UART_Num] = UART_Buffer[0];
if(UART_Num == 0) { TIM7_timerFalg = 0; HAL_TIM_Base_Start_IT(&htim7); }
UART_Num++;
if(UART_Num == 45) { if(Recv_data[44] == 0x8F & Recv_data[0] == 0x7F) { UART_Num = 0; TIM7_timerFalg = 0; HAL_TIM_Base_Stop_IT(&htim7);
for (int i = 0; i < UART_BUFFERSIZE; i++) { if(i < 43) { UART_SUM = UART_SUM + Recv_data[i]; } }
if(Recv_data[0] == 0x7F & Recv_data[44] == 0x8F & Recv_data[43] == UART_SUM & Recv_data[2] == 0x28) //桢头、帧尾、校验和、传输字节数 { //数据接收正确处理 } else { UART_Num = 0; HAL_TIM_Base_Start_IT(&htim7); } } else { UART_Num = 0; } } } }
/** * 函数功能: 非阻塞模式下定时器的回调函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == htim6.Instance) { TIM6_timer_count++;
if(TIM6_timer_count == 1000) //1s { TIM6_timer_count = 0; TIM6_timerFalg = 1; // printf("%d ", timerFalg); // HAL_TIM_Base_Stop_IT(&htim6); } }
if (htim->Instance == htim7.Instance) { TIM7_timer_count++;
if(TIM7_timer_count == 1000) //1s { TIM7_timer_count = 0; TIM7_timerFalg = 1; } } } |