藍橋杯嵌入式組第十二屆省賽題目解析+STM32G431RBT6實現源碼

文章目錄

  • 1.題目解析
    • 1.1 分而治之,藕斷絲連
    • 1.2 模塊化思維導圖
    • 1.3 模塊解析
      • 1.3.1 KEY模塊
      • 1.3.2 LED模塊
      • 1.3.3 LCD模塊
      • 1.3.4 TIM模塊
      • 1.3.5 UART模塊
        • 1.3.5.1 uart數據解析
  • 2.源碼
  • 3.第十二屆題目

前言:STM32G431RBT6實現嵌入式組第十二屆題目解析+源碼,本文默認讀者具備基礎的stm32知識。文章末尾有第十二屆題目。

1.題目解析

第十二屆雖說題目長,難度集中體現在uart接收的數據處理上。

1.1 分而治之,藕斷絲連

還是那句話,將不同模塊進行封裝,通過變量進行模塊間的合作。
函數將模塊分而治之,變量使模塊間藕斷絲連。

1.2 模塊化思維導圖

下圖根據題目梳理。還是使用思維導圖。
在這里插入圖片描述

1.3 模塊解析

1.3.1 KEY模塊

還是控制按一次處理一次。老朋友了我們就不多說了,題目限制了按鍵消抖和單次處理,所以我們要加上消抖,和第十一屆的處理一模一樣。
具體實現看源碼

1.3.2 LED模塊

ld1:有空閑車位亮,否則滅
ld2:PWM占空比20%輸出亮,輸出低電平滅
解決辦法,設置一個標志位代表ld1~ld8,改變對應位的的值,再將標志位寫入ODR寄存器中來控制led的亮滅。
具體實現看源碼

1.3.3 LCD模塊

lcd顯示兩個界面,注意首次切換的時候得清屏。
根據B1界面1和界面2切換;
狀態0:參數界面;
在這里插入圖片描述

狀態1:費用設置界面;
在這里插入圖片描述
具體實現看源碼

1.3.4 TIM模塊

TIM2產生1s時基。PSC:16999,ARR:9999;
TIM17通道1產生2kHzPWM。PSC:16,ARR:4999;
PSC和ARR計算公式(計算周期就是頻率的倒數):
在這里插入圖片描述

/* 定時開啟uart接收中斷1s */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{HAL_UARTEx_ReceiveToIdle_IT(&huart1, uart_rx_data, 24);
}
/* pa7pwm輸出 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{if(pa7_pwm_ctrl == 1) TIM17->CCR1 = 999;else TIM17->CCR1 = 0;
}

1.3.5 UART模塊

12屆題目的難度就在uart的數據處理上。
1.單片機接收來自電腦固定格式的數據,我們就需要數據限制條件來寫解析接收的數據,數據長度,停車類別,車牌格式,時間格式。
2.如果格式錯誤返回Error,else判斷是停車還是取車。
2.1 應該先判斷取車,這大家都能理解。如果是取車,計算收費,時間,返回給電腦。
2.2 如果是存車,先要判斷是否有空閑車位,如果有存車,如果沒有不做處理。
具體其他涉及函數代碼請看源碼

/* uart接收數據處理 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(analyze_uart_str(uart_rx_data))   //分析數據格式是否正確,錯誤傳輸Error{HAL_UART_Transmit_IT(&huart1, (uint8_t*)"Error", 7); }/*格式正確處理順序 :判斷是否是取車(停車場已有該車)-> 是: 取車+計算收費, 否: 判斷是否有空閑車位 -> 是:停車計時,否:不做處理*/else{                                     uint8_t i = find_car_in_parking(parking_flag_temporary); if(i != 8){   //表示取車if(!strcmp(parking_flag_temporary.parking_type, "VNBR")){    //計算停車費parking_fee = caculate_parking_time(i)*V_money;parking_spaces.VNBR--;parking_spaces.IDLE++;}else if(!strcmp(parking_flag_temporary.parking_type, "CNBR")){parking_fee = caculate_parking_time(i)*C_money;parking_spaces.CNBR--;parking_spaces.IDLE++;}sprintf((char*)parking_fee_str, "%4s:%4s:%u:%.2f", parking_flag_temporary.parking_type,parking_flag_temporary.car_num, caculate_parking_time(i), parking_fee);HAL_UART_Transmit_IT(&huart1, parking_fee_str, strlen((char*)parking_fee_str));memset(&parking_flag[i], 0, sizeof(parking_flag[i]));memset(&parking_time[i], 0, sizeof(parking_time[i]));}else{        //停車          i = find_free_parking();              if(i!=8){               //有空閑車位parking_flag[i] = parking_flag_temporary;parking_time[i] = parking_time_temporary;if(!strcmp(parking_flag_temporary.parking_type, "CNBR")){parking_spaces.CNBR++;parking_spaces.IDLE--;}else if(!strcmp(parking_flag_temporary.parking_type, "VNBR")){parking_spaces.VNBR++;parking_spaces.IDLE--;}}}}
}
1.3.5.1 uart數據解析

我們可以使用指針加for單個字符判斷,也可以使用string.h庫中的字符處理函數,strcmp(), strcpy(),strncmp(), strncpy()等函數,將數據先切段,再通過各段的限制條件進行格式判斷。

/**
*   @brief 判斷uart接收到的數據格式是否正確,這里只有長度判斷、車位類型、車位號碼、時間格式的判斷,
*   還可以加時間的大小比如月份只能是1~12月。還有解析時間的時候,假如說要取車,那取車時間肯定大于停車時間……
*   @para str: uart接收數據
*   @retval 1:數據格式錯誤,0:正確
*/
uint8_t analyze_uart_str(uint8_t *str)
{if(strlen((char*)str) != 24){  //return 1;}else{uint8_t *p = str;if(*p == 'C' || *p == 'V' && !strncasecmp((char*)p+1, "NBR", 3)) {strncpy(parking_flag_temporary.parking_type, (char*)str, 4);  }else return 1;for(p = str+5;p<str+9;p++){if(*p<0 || *p>127) return 1;}strncpy(parking_flag_temporary.car_num, (char*)str+5, 4);for(p = str+10; *p!='\0';p++){if(*p<'0' || *p > '9') return 1;}strncpy(parking_flag_temporary.time, (char*)str+10, 14);sscanf(parking_flag_temporary.time,"%4hu%2hhu%2hhu%2hhu%2hhu%2hhu", &parking_time_temporary.years, &parking_time_temporary.dates, &parking_time_temporary.days,&parking_time_temporary.hours, &parking_time_temporary.minutes, &parking_time_temporary.seconds);}return 0;
}

2.源碼

我所有的實現都在main.c文件中。

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.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 *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//按鍵四種狀態
enum{key_released = 0U,key_reduction,key_pressed,key_wait_released,
};//停車位狀態
typedef struct {uint8_t CNBR;uint8_t VNBR;uint8_t IDLE;
} parking_t;
parking_t parking_spaces = {0, 0, 8};//存儲解析uart數據
typedef struct {char parking_type[5];char car_num[5];char time[15];
}parking_flag_t;
parking_flag_t parking_flag[8] = {0}, parking_flag_temporary = {0};//將時間字符串解析成數據
typedef struct{uint16_t years;uint8_t dates;uint8_t days;uint8_t hours;uint8_t minutes;uint8_t seconds;
}calendar_t;
calendar_t parking_time[8] = {0},parking_time_temporary = {0};/*
lcd_show_conv: lcd界面切換
pa7_pwm_ctrl: pwm輸出控制
lcd_clear_flag: 清屏標志
ld_flag: ld狀態標志
*/
uint8_t lcd_show_conv = 0, pa7_pwm_ctrl = 0, lcd_clear_flag = 0, ld_flag = 0;
/*
uart_rx_data: 接收來自串口的24字節的數據
lcd_str: lcd顯示
parking_fee_str: 串口回復收費信息buff
*/
uint8_t uart_rx_data[25] = {0}, lcd_str[21] = {0}, parking_fee_str[25] = {0};
//消抖時間標記
uint32_t key_redu_tim = 0;
/*
keys_volt: 按鍵電平信息
keys_state: 按鍵狀態信息
*/
uint8_t keys_volt[4] = {0}, keys_state[4] = {0};
/*
C_money: CNBR停車收費元/小時
V_money: VNBR停車收費元/小時
parking_fee: 計算停車費
*/
float C_money = 3.5f, V_money = 2.0f, parking_fee = 0.0f;void key_state_gain();
void key_process();
void lcd_process();
uint8_t analyze_uart_str(uint8_t *str);
uint8_t find_free_parking();
uint8_t find_car_in_parking(parking_flag_t p);
uint32_t caculate_parking_time(uint8_t i);
void led_process();/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);/* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();MX_TIM17_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start_IT(&htim17, TIM_CHANNEL_1);HAL_UARTEx_ReceiveToIdle_IT(&huart1, uart_rx_data, 24);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */key_state_gain();key_process();lcd_process();led_process();}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV6;RCC_OscInitStruct.PLL.PLLN = 85;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
/* 獲取按鍵狀態 */
void key_state_gain()
{keys_volt[0] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);keys_volt[1] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);keys_volt[2] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);keys_volt[3] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);for(int i=0;i<4;i++){if(keys_volt[i] == 0){if(keys_state[i] == key_released){key_redu_tim = HAL_GetTick();keys_state[i] = key_reduction;}else if(keys_state[i] == key_reduction){if(HAL_GetTick() - key_redu_tim>=10){keys_state[i] = key_pressed;}}else if(keys_state[i] == key_pressed)keys_state[i] = key_wait_released;}else{if(keys_state[i] == key_wait_released || keys_state[i] == key_pressed){key_redu_tim = HAL_GetTick();keys_state[i] = key_reduction;}else if(keys_state[i] == key_reduction){if(HAL_GetTick() - key_redu_tim>=10){keys_state[i] = key_released;}}else keys_state[i] = key_released;     }}
}
/* 根據按鍵狀態設置對應標志 */
void key_process()
{if(keys_state[0] == key_pressed){ //界面切換lcd_show_conv ^= 1;}if(lcd_show_conv == 1){   //B2B3只在界面1起作用if(keys_state[1] == key_pressed){  //++C_money+= 0.5;V_money+= 0.5;}if(keys_state[2] == key_pressed){ //--C_money-= 0.5;V_money-= 0.5;if(V_money < 0) {C_money = 1.5;V_money = 0.0f;}}}if(keys_state[3] == key_pressed){   //pwm控制pa7_pwm_ctrl ^= 1;}
}
/* lcd兩種狀態 */
void lcd_process()
{switch(lcd_show_conv){case 0:if(lcd_clear_flag == 1){lcd_clear_flag = 0;LCD_Clear(Black);}sprintf((char*)lcd_str, "        Data        ");LCD_DisplayStringLine(Line2, lcd_str);sprintf((char*)lcd_str, "  CNBR:%d            ", parking_spaces.CNBR);LCD_DisplayStringLine(Line4, lcd_str);sprintf((char*)lcd_str, "  VNBR:%d            ", parking_spaces.VNBR);LCD_DisplayStringLine(Line6, lcd_str);sprintf((char*)lcd_str, "  IDLE:%d            ", parking_spaces.IDLE);LCD_DisplayStringLine(Line8, lcd_str);break;case 1:if(lcd_clear_flag == 0){lcd_clear_flag = 1;LCD_Clear(Black);}sprintf((char*)lcd_str, "        Data        ");LCD_DisplayStringLine(Line2, lcd_str);sprintf((char*)lcd_str, "  CNBR:%.2f         ", C_money);LCD_DisplayStringLine(Line4, lcd_str);sprintf((char*)lcd_str, "  VNBR:%.2f         ", V_money);LCD_DisplayStringLine(Line6, lcd_str);break;}
}
/**
*   @brief 判斷uart接收到的數據格式是否正確,這里只有長度判斷、車位類型、車位號碼、時間格式的判斷,
*   還可以加時間的大小比如月份只能是1~12月。還有解析時間的時候,假如說要取車,那取車時間肯定大于停車時間……
*   @para str: uart接收數據
*   @retval 1:數據格式錯誤,0:正確
*/
uint8_t analyze_uart_str(uint8_t *str)
{if(strlen((char*)str) != 24){  //return 1;}else{uint8_t *p = str;if(*p == 'C' || *p == 'V' && !strncasecmp((char*)p+1, "NBR", 3)) {strncpy(parking_flag_temporary.parking_type, (char*)str, 4);  }else return 1;for(p = str+5;p<str+9;p++){if(*p<0 || *p>127) return 1;}strncpy(parking_flag_temporary.car_num, (char*)str+5, 4);for(p = str+10; *p!='\0';p++){if(*p<'0' || *p > '9') return 1;}strncpy(parking_flag_temporary.time, (char*)str+10, 14);sscanf(parking_flag_temporary.time,"%4hu%2hhu%2hhu%2hhu%2hhu%2hhu", &parking_time_temporary.years, &parking_time_temporary.dates, &parking_time_temporary.days,&parking_time_temporary.hours, &parking_time_temporary.minutes, &parking_time_temporary.seconds);}return 0;
}
/* 查找是否有空閑車位 */
uint8_t find_free_parking()
{for(uint8_t i=0;i<8;i++){if(parking_flag[i].parking_type[0] != 'V' && parking_flag[i].parking_type[0] != 'C'){return i;}}return 8;
}
/* 查找是否該車要取車 */
uint8_t find_car_in_parking(parking_flag_t p)
{for(uint8_t i=0;i<8;i++){if(!strncasecmp(parking_flag[i].parking_type, p.parking_type, 4) && !strncasecmp(parking_flag[i].car_num, p.car_num, 4)){return i;}}return 8;
}
/* 停車時間計算 */
uint32_t caculate_parking_time(uint8_t i)
{uint32_t hour = 0;hour = (parking_time_temporary.years - parking_time[i].years)*365*24;hour += (parking_time_temporary.dates - parking_time[i].dates)*30*24;hour += (parking_time_temporary.days - parking_time[i].days)*24;hour += (parking_time_temporary.hours - parking_time[i].hours);if((parking_time_temporary.minutes-parking_time[i].minutes) >0 ||(parking_time_temporary.seconds-parking_time[i].seconds) > 0){hour++;}return hour;
}
/* led狀態更新 */
void led_process()
{if(parking_spaces.IDLE > 0){ld_flag = 1;}else ld_flag = 0;if(pa7_pwm_ctrl == 1){ld_flag += 1<<1;}else ld_flag += 0<< 1;HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, 1);GPIOC->ODR = 0xffff ^ ld_flag << 8;HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, 0);
}
/* 定時開啟uart接收中斷1s */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{HAL_UARTEx_ReceiveToIdle_IT(&huart1, uart_rx_data, 24);
}
/* pa7pwm輸出 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{if(pa7_pwm_ctrl == 1) TIM17->CCR1 = 999;else TIM17->CCR1 = 0;
}
/* uart接收數據處理 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(analyze_uart_str(uart_rx_data))   //分析數據格式是否正確,錯誤傳輸Error{HAL_UART_Transmit_IT(&huart1, (uint8_t*)"Error", 7); }/*格式正確處理順序 :判斷是否是取車(停車場已有該車)-> 是: 取車+計算收費, 否: 判斷是否有空閑車位 -> 是:停車計時,否:不做處理*/else{                                     uint8_t i = find_car_in_parking(parking_flag_temporary); if(i != 8){   //表示取車if(!strcmp(parking_flag_temporary.parking_type, "VNBR")){    //計算停車費parking_fee = caculate_parking_time(i)*V_money;parking_spaces.VNBR--;parking_spaces.IDLE++;}else if(!strcmp(parking_flag_temporary.parking_type, "CNBR")){parking_fee = caculate_parking_time(i)*C_money;parking_spaces.CNBR--;parking_spaces.IDLE++;}sprintf((char*)parking_fee_str, "%4s:%4s:%u:%.2f", parking_flag_temporary.parking_type,parking_flag_temporary.car_num, caculate_parking_time(i), parking_fee);HAL_UART_Transmit_IT(&huart1, parking_fee_str, strlen((char*)parking_fee_str));memset(&parking_flag[i], 0, sizeof(parking_flag[i]));memset(&parking_time[i], 0, sizeof(parking_time[i]));}else{        //停車          i = find_free_parking();              if(i!=8){               //有空閑車位parking_flag[i] = parking_flag_temporary;parking_time[i] = parking_time_temporary;if(!strcmp(parking_flag_temporary.parking_type, "CNBR")){parking_spaces.CNBR++;parking_spaces.IDLE--;}else if(!strcmp(parking_flag_temporary.parking_type, "VNBR")){parking_spaces.VNBR++;parking_spaces.IDLE--;}}}}
}/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

3.第十二屆題目

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72280.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL】表的約束(上)

文章目錄 表的約束什么是表的約束空屬性默認值列描述&#xff08;comment&#xff09;零填充&#xff08;zerofill&#xff09;主鍵 總結 表的約束 什么是表的約束 表的約束&#xff08;Constraints&#xff09;是數據庫表中的規則&#xff0c;用于限制存儲的數據&#xff0c…

【Unity網絡同步框架 - Nakama研究(三)】

文章目錄 【Unity網絡同步框架 - Nakama研究(三)】準備工作前言Unity部分連接服務器創建并進入房間創建人物人物移動和同步 【Unity網絡同步框架 - Nakama研究(三)】 以下部分需要有一定的Unity基礎&#xff0c;在官方的案例Pirate Panic基礎上進行修改而成。如果沒有下載并熟悉…

前端存儲-indexdb封裝:dexie.js的使用

前言 indexedDB是一個用于在瀏覽器中存儲較大數據結構的Web API&#xff0c;并且提供了索引功能以實現高性能查找。dexie.js是對indexdb的封裝&#xff0c;前端用起來很方便。在此介紹一下項目中用到的操作語句&#xff0c;也方便記錄。我的項目是vue3項目。 開始 1、安裝 …

【AD】6-1 PCB常用規則

間距規則&#xff1a; 可自行修改線寬與間距&#xff08;默認10mil&#xff09; 線寬規則&#xff1a;電源線寬加粗 布線過程中更改線寬&#xff1a;走線狀態下&#xff0c;shiftw更改線寬&#xff0c;線寬要在規則范圍之內過孔規則&#xff1a; 阻焊規則&#xff1a;

MyBatis 的核心配置文件是干什么的? 它的結構是怎樣的? 哪些是必須配置的,哪些是可選的?

MyBatis 的核心配置文件&#xff08;通常命名為 mybatis-config.xml&#xff09;是 MyBatis 應用程序的入口點&#xff0c;它定義了 MyBatis 的全局配置信息 。 核心配置文件的作用&#xff1a; 配置 MyBatis 的運行時行為: 通過 <settings> 標簽設置全局參數&#xff…

搜廣推校招面經四十九

tiktok廣告算法 一、倒排索引原理及Map中Key的處理 具體使用方法見【搜廣推校招面經三十六】 倒排索引&#xff08;Inverted Index&#xff09;是信息檢索系統中常用的一種數據結構&#xff0c;用于快速查找包含某個關鍵詞的文檔。以下是倒排索引的原理及Map中Key的處理方式的…

【零基礎入門unity游戲開發——unity3D篇】3D物理系統之 —— 3D剛體組件Rigidbody

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

C# net deepseek RAG AI開發 全流程 介紹

deepseek本地部署教程及net開發對接 步驟詳解&#xff1a;安裝教程及net開發對接全流程介紹 DeepSeekRAG 中的 RAG&#xff0c;全稱是 Retrieval-Augmented Generation&#xff08;檢索增強生成&#xff09;&#xff0c;是一種結合外部知識庫檢索與大模型生成能力的技術架構。其…

用舊的手機搭建 MQTT Broker

MQTT Broker搭建 在Android上搭建MQTT所需工具: termux 通過網盤分享的文件:termux-app_v0.118.1+github-debug_armeabi-v7a.apk 鏈接: https://pan.baidu.com/s/1Iii2szXAc02cKVGdP1EuzQ?pwd=fqsc 提取碼: fqsc 在 Termux 中使用 MQTT(Message Queuing Telemetry Trans…

b站視頻下載工具軟件怎么下載

自行配置FFMPEG環境 請優先選擇批量下載&#xff0c;會自處理視頻和音頻文件。 如果要下載更高質量請登陸。 沒有配置FFMPEG下載后會有報錯提示&#xff0c;視頻音頻文件無法合并生成mp4文件 更新批量下載標題&#xff0c;只取視頻原標題&#xff0c;B站反爬機制登陸后下載多了…

# linux有哪些桌面環境?有哪些顯示服務器協議及顯示服務器?有哪些用于開發圖形用戶界面的工具包?

linux有哪些桌面環境&#xff1f;有哪些顯示服務器協議及顯示服務器&#xff1f;有哪些用于開發圖形用戶界面的工具包&#xff1f; 文章目錄 linux有哪些桌面環境&#xff1f;有哪些顯示服務器協議及顯示服務器&#xff1f;有哪些用于開發圖形用戶界面的工具包&#xff1f;1 顯…

Java 大視界 -- Java 大數據分布式計算中的資源調度與優化策略(131)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

躲藏博弈中的策略優化:整合歷史數據、概率論與博弈論

躲藏博弈中的策略優化&#xff1a;整合歷史數據、概率論與博弈論 一、引言 躲藏博弈(Hiding Games)作為一類特殊的博弈模型&#xff0c;廣泛存在于軍事對抗、網絡安全、商業競爭甚至日常生活中。其核心在于一方(躲藏者)試圖避免被另一方(尋找者)發現&#xff0c;雙方各自選擇…

時序數據庫 TDengine 到 MySQL 數據遷移同步

簡述 TDengine 是一款開源、高性能、云原生的時序數據庫&#xff0c;專為物聯網、車聯網、工業互聯網、金融、IT 運維等場景優化設計。在工業自動化的時代&#xff0c;時序數據庫在電力、軌道交通、智能制造等領域有著廣泛的應用。 MySQL 是全球廣泛使用的開源關系型數據庫&a…

基于YOLO11深度學習的舌苔舌象檢測識別與診斷系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

【愚公系列】《高效使用DeepSeek》003-DeepSeek文檔處理和其他頂級 AI模型的區別

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

正新雞排:在變革浪潮中領航,打造連鎖餐飲新生態

在當下風云變幻的餐飲市場中&#xff0c;連鎖品牌猶如逆水行舟&#xff0c;不進則退。作為國內坐擁萬店的知名連鎖餐飲品牌&#xff0c;正新雞排2023年賣出了7.2億片雞排&#xff0c;集團營收同比增長28%。在《2024年中國雞排連鎖品牌10強榜單》中&#xff0c;正新雞排以高達95…

MyBatis 的一級、二級緩存

文章目錄 1?? 一級緩存&#xff08;Local Cache&#xff09;&#x1f4cc; 定義&#x1f680; 示例代碼 2?? 二級緩存&#xff08;Global Cache&#xff09;&#x1f4cc; 定義&#x1f680; 使用方式 3?? 一級緩存 vs. 二級緩存 &#x1f4ca;4?? 數據共享問題&#x…

軟件性能測試與功能測試聯系和區別

隨著軟件開發技術的迅猛發展&#xff0c;軟件性能測試和功能測試成為了確保軟件質量的兩個重要環節。那么只有一字之差的性能測試和功能測試分別是什么?又有哪些聯系和區別呢? 一、軟件性能測試是什么?   軟件性能測試是為了評估軟件系統在特定條件下的表現&#xff0c;包…

Vue 框架使用難點與易錯點剖析:避開陷阱,提升開發效率

Vue.js 作為當下最流行的前端框架之一&#xff0c;以其輕量、易用和靈活的特性深受開發者喜愛。然而&#xff0c;即使是經驗豐富的開發者&#xff0c;在使用 Vue 的過程中也難免會遇到一些難點和易錯點。本文將深入分析 Vue 開發中常見的“坑”&#xff0c;并提供解決方案和代碼…