初始化毕业设计项目

This commit is contained in:
2026-05-01 20:29:02 +08:00
commit df5b05e936
158 changed files with 67957 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
#include "K210_USART.h"
#include "Debug.h" // 添加调试支持
#include <stdio.h>
#include <string.h>
// 引用来自 main.c 的全局变量
extern volatile char g_k210_rx_buffer[];
extern volatile uint16_t g_k210_rx_counter;
extern volatile uint8_t g_k210_rx_flag;
// 全局变量:存储解析后的人脸识别结果
FaceRecognitionResult K210_FaceResult;
void K210_USART_Init(void)
{
// 根据连接图.md: K210使用USART3 (PB10/PB11)
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
// PB10: USART3_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// PB11: USART3_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART3, ENABLE);
}
/**
* @brief 解析K210发送的人脸识别数据
* @param buffer 接收到的数据缓冲区
* @param result 解析结果存储结构体
* @retval 1=解析成功, 0=解析失败
*
* K210数据格式示例: "ID:2021001,NAME:Zhang_San,CONF:0.95"
* 或者: "UNKNOWN" (未识别到人脸)
*/
uint8_t K210_ParseFaceData(const char* buffer, FaceRecognitionResult* result)
{
DEBUG_PRINT("[K210] Raw data: %s\r\n", buffer);
// 清空结果结构体
memset(result, 0, sizeof(FaceRecognitionResult));
// 检查是否为未识别
if (strstr(buffer, "UNKNOWN") != NULL)
{
DEBUG_INFO("[K210] Unknown face detected");
result->success = 0;
strcpy(result->student_name, "Unknown");
return 1;
}
// 尝试解析完整数据
char id[20] = {0};
char name[32] = {0};
float conf = 0.0f;
// 解析格式: ID:2021001,NAME:Zhang_San,CONF:0.95
int parsed = sscanf(buffer, "ID:%19[^,],NAME:%31[^,],CONF:%f", id, name, &conf);
if (parsed == 3)
{
DEBUG_PRINT("[K210] Parsed: ID=%s, Name=%s, Conf=%.2f\r\n", id, name, conf);
result->success = 1;
strncpy(result->student_id, id, 19);
result->student_id[19] = '\0';
// 将下划线替换为空格(方便显示)
strncpy(result->student_name, name, 31);
result->student_name[31] = '\0';
for (int i = 0; result->student_name[i] != '\0'; i++)
{
if (result->student_name[i] == '_')
result->student_name[i] = ' ';
}
result->confidence = conf;
return 1;
}
DEBUG_ERROR("[K210] Parse failed!");
return 0; // 解析失败
}
uint8_t K210_GetRxFlag(void)
{
if (g_k210_rx_flag)
{
DEBUG_INFO("[K210] Data received, parsing...");
// 解析K210发送的人脸识别数据
K210_ParseFaceData((const char*)g_k210_rx_buffer, &K210_FaceResult);
g_k210_rx_flag = 0; // 清除标志位
g_k210_rx_counter = 0; // 重置计数器
// 清空缓冲区,防止数据粘连
memset((void*)g_k210_rx_buffer, 0, K210_RX_BUFFER_SIZE);
return 1;
}
return 0;
}
void K210_ClearRxFlag(void)
{
g_k210_rx_flag = 0;
g_k210_rx_counter = 0;
}