当前位置: 首页 > news >正文

STM32 与 AS608 指纹模块的调试与应用

前言

在嵌入式系统中,指纹识别作为一种生物识别技术,广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块,实现指纹的录入和识别功能。
在这里插入图片描述

硬件准备

  • STM32F103C8T6 开发板
  • AS608 指纹模块
  • OLED 显示屏(用于显示提示信息)
  • 杜邦线若干

硬件连接

确保硬件连接正确,以下是主要的连接:

  • AS608 指纹模块与 STM32 的连接:

    • AS608 TXD(发送端) ==> STM32 PA3(USART2 RX)
    • AS608 RXD(接收端) ==> STM32 PA2(USART2 TX)
    • AS608 VCC ==> 3.3V
    • AS608 GND ==> GND
  • OLED 显示屏与 STM32 的连接:

    按照 OLED 屏幕的接线要求进行连接,一般使用 I2C 或 SPI 接口。

软件设计

项目结构

  • main.c:主程序入口,负责整体流程控制。
  • AS608.c / AS608.h:封装与 AS608 指纹模块的通信与操作函数。
  • 其他外设驱动文件:如 OLED 显示屏的驱动代码。

主程序流程

  1. 初始化外设:OLED 显示屏、USART2(用于与 AS608 通信)等。
  2. 等待 3 秒:给用户准备时间。
  3. 指纹录入
    • 提示用户放置手指。
    • 获取指纹图像,并生成特征文件。
    • 提示用户再次放置手指,重复上述步骤。
    • 合成指纹模板并存储到指纹库中。
  4. 等待 2 秒
  5. 指纹识别
    • 提示用户放置手指。
    • 获取指纹图像,生成特征文件。
    • 在指纹库中搜索匹配的指纹。
    • 显示识别结果(匹配的指纹 ID 或未找到)。

代码实现

1. main.c
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "AS608.h"int main(void)
{// 初始化外设OLED_Init();AS608_Init();OLED_ShowString(1, 1, "AS608:");while(1){Delay_s(3);  // 等待3秒OLED_ShowString(2, 1, "Enrolling...");if (AS608_Enroll() == 0){OLED_ShowString(2, 1, "Enroll OK    ");}else{OLED_ShowString(2, 1, "Enroll Failed");}Delay_s(2);  // 再等待2秒(总共5秒)OLED_ShowString(2, 1, "Identifying...");uint16_t id;if (AS608_Identify(&id) == 0){OLED_ShowString(2, 1, "ID:");OLED_ShowNum(2, 4, id, 5);}else{OLED_ShowString(2, 1, "Not Found    ");}Delay_s(2);  // 等待2秒显示结果}
}
2. AS608.h
#ifndef __AS608_H
#define __AS608_H#include "stm32f10x.h"// 指令代码
#define PS_GetImage          0x01
#define PS_GenChar           0x02
#define PS_Match             0x03
#define PS_Search            0x04
#define PS_RegModel          0x05
#define PS_StoreChar         0x06
#define PS_LoadChar          0x07
#define PS_UpChar            0x08
#define PS_DownChar          0x09
#define PS_UpImage           0x0A
#define PS_DownImage         0x0B
#define PS_DeleteChar        0x0C
#define PS_Empty             0x0D
#define PS_SetSysPara        0x0E
#define PS_ReadSysPara       0x0F
#define PS_SetPwd            0x12
#define PS_VerifyPwd         0x13
#define PS_TemplateNum       0x1D// 确认码
#define ACK_SUCCESS          0x00void AS608_Init(void);
uint8_t AS608_Enroll(void);
uint8_t AS608_Identify(uint16_t *id);#endif /* __AS608_H */
3. AS608.c
#include "AS608.h"
#include "Delay.h"
#include "OLED.h"
#include <stdio.h>void AS608_Init(void)
{// USART2 初始化RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置 USART2 引脚GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  // TXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  // RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置 USART2USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 57600;  // AS608默认波特率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(USART2, &USART_InitStructure);USART_Cmd(USART2, ENABLE);
}void AS608_SendByte(uint8_t Byte)
{USART_SendData(USART2, Byte);while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}void AS608_SendArray(uint8_t *Array, uint16_t Length)
{for (uint16_t i = 0; i < Length; i++){AS608_SendByte(Array[i]);}
}uint8_t AS608_ReceiveByte(void)
{uint32_t timeout = 0xFFFFF; // 增加超时时间while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){if (--timeout == 0){return 0xFF;  // 超时返回}}return USART_ReceiveData(USART2);
}// 发送指令包
void AS608_SendCommand(uint8_t instruction_code, uint8_t *parameters, uint16_t parameter_length)
{uint16_t packet_length = parameter_length + 2; // instruction code + parametersuint8_t packet[12 + parameter_length];uint16_t checksum = 0;// 包头packet[0] = 0xEF;packet[1] = 0x01;// 地址packet[2] = 0xFF;packet[3] = 0xFF;packet[4] = 0xFF;packet[5] = 0xFF;// 包标识packet[6] = 0x01; // 指令包// 包长度packet[7] = (packet_length >> 8) & 0xFF;packet[8] = packet_length & 0xFF;// 指令码packet[9] = instruction_code;// 参数for (uint16_t i = 0; i < parameter_length; i++){packet[10 + i] = parameters[i];}// 计算校验和checksum = packet[6] + packet[7] + packet[8];for (uint16_t i = 9; i < 10 + parameter_length; i++){checksum += packet[i];}// 校验和packet[10 + parameter_length] = (checksum >> 8) & 0xFF;packet[11 + parameter_length] = checksum & 0xFF;// 发送包AS608_SendArray(packet, 12 + parameter_length);
}// 接收响应包
uint8_t AS608_ReceivePacket(uint8_t *buffer, uint16_t *length)
{uint16_t idx = 0;uint16_t i;uint16_t checksum = 0;// 读取包头和地址,共6字节for (i = 0; i < 6; i++){buffer[idx++] = AS608_ReceiveByte();}// 检查包头和地址if (buffer[0] != 0xEF || buffer[1] != 0x01){return 1; // 包头错误}// 读取包标识和长度,共3字节for (i = 0; i < 3; i++){buffer[idx++] = AS608_ReceiveByte();}uint16_t packet_length = (((uint16_t)buffer[7] << 8) | buffer[8]) - 2; // 减去校验和长度// 读取包内容和校验和for (i = 0; i < packet_length + 2; i++){buffer[idx++] = AS608_ReceiveByte();}*length = idx;// 计算校验和for (i = 6; i < idx - 2; i++){checksum += buffer[i];}uint16_t received_checksum = ((uint16_t)buffer[idx - 2] << 8) | buffer[idx - 1];if (checksum != received_checksum){return 2; // 校验和错误}return 0; // 成功
}// 指纹录入函数
uint8_t AS608_Enroll(void)
{uint8_t ack;uint8_t buffer[64];uint16_t length;uint16_t page_id = 0; // 假设将指纹存储在ID为0的位置uint8_t retry;// 提示放置手指OLED_ShowString(2, 1, "Place Finger ");// Step 1: 获取图像retry = 0;do{AS608_SendCommand(PS_GetImage, NULL, 0);ack = AS608_ReceivePacket(buffer, &length);if (ack == 0 && buffer[9] == ACK_SUCCESS){break;}else if (ack == 0 && buffer[9] == 0x02){OLED_ShowString(3, 1, "No Finger    ");}else{OLED_ShowString(3, 1, "GetImage Err ");}Delay_ms(500);retry++;} while (retry < 10);if (retry >= 10){return 1; // 超时}// Step 2: 生成特征文件到CharBuffer1uint8_t param[1] = {0x01}; // Buffer1AS608_SendCommand(PS_GenChar, param, 1);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 错误}// 提示移开手指OLED_ShowString(2, 1, "Remove Finger");Delay_s(2);// 提示再次放置手指OLED_ShowString(2, 1, "Place Again  ");// Step 3: 再次获取图像retry = 0;do{AS608_SendCommand(PS_GetImage, NULL, 0);ack = AS608_ReceivePacket(buffer, &length);if (ack == 0 && buffer[9] == ACK_SUCCESS){break;}Delay_ms(500);retry++;} while (retry < 10);if (retry >= 10){return 1; // 超时}// Step 4: 生成特征文件到CharBuffer2param[0] = 0x02; // Buffer2AS608_SendCommand(PS_GenChar, param, 1);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 错误}// Step 5: 合并特征到模板AS608_SendCommand(PS_RegModel, NULL, 0);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 错误}// Step 6: 存储模板到指定IDuint8_t store_param[3] = {0x01, (page_id >> 8) & 0xFF, page_id & 0xFF};AS608_SendCommand(PS_StoreChar, store_param, 3);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 错误}return 0; // 成功
}// 指纹识别函数
uint8_t AS608_Identify(uint16_t *id)
{uint8_t ack;uint8_t buffer[64];uint16_t length;uint8_t retry;// 提示放置手指OLED_ShowString(2, 1, "Place Finger ");// Step 1: 获取图像retry = 0;do{AS608_SendCommand(PS_GetImage, NULL, 0);ack = AS608_ReceivePacket(buffer, &length);if (ack == 0 && buffer[9] == ACK_SUCCESS){break;}else if (ack == 0 && buffer[9] == 0x02){OLED_ShowString(3, 1, "No Finger    ");}else{OLED_ShowString(3, 1, "GetImage Err ");}Delay_ms(500);retry++;} while (retry < 10);if (retry >= 10){return 1; // 超时}// Step 2: 生成特征文件到CharBuffer1uint8_t param[1] = {0x01}; // Buffer1AS608_SendCommand(PS_GenChar, param, 1);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 错误}// Step 3: 搜索指纹库uint8_t search_param[6] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x01}; // Buffer1, 起始页0,页数1AS608_SendCommand(PS_Search, search_param, 6);ack = AS608_ReceivePacket(buffer, &length);if (ack != 0 || buffer[9] != ACK_SUCCESS){return 1; // 未找到}// 获取匹配到的指纹ID*id = ((uint16_t)buffer[10] << 8) | buffer[11];return 0; // 成功
}

关键问题与解决方案

问题描述

在实现过程中,发现程序一直停留在 Place Finger 提示,无法继续。这表明程序可能在等待指纹模块的响应,但未能收到正确的数据。

可能原因
  1. USART 通讯问题

    • 波特率设置不正确。
    • USART 引脚连接错误。
    • USART 接收函数未正确实现。
  2. 指令包格式错误

    • 指令包中的参数、校验和计算错误。
    • 未正确按照 AS608 通讯协议发送和接收数据。
  3. 指纹模块未正常工作

    • 模块损坏或供电不足。
    • 指纹库已满或需要初始化。
解决方案
  1. 检查 USART 通讯配置

    • 确保波特率设置为 57600,这是 AS608 的默认波特率。

    • 检查 USART2 初始化代码,确保配置正确。

      // 配置 USART2
      USART_InitTypeDef USART_InitStructure;
      USART_InitStructure.USART_BaudRate = 57600;  // AS608默认波特率
      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(USART2, &USART_InitStructure);
      
    • 确认引脚连接:

      • PA2(USART2 TX) ==> AS608 RXD
      • PA3(USART2 RX) ==> AS608 TXD
  2. 改进接收函数 AS608_ReceiveByte

    • 增加超时时间,避免因等待时间过短导致接收失败。

      uint8_t AS608_ReceiveByte(void)
      {uint32_t timeout = 0xFFFFF; // 增加超时时间while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){if (--timeout == 0){return 0xFF;  // 超时返回}}return USART_ReceiveData(USART2);
      }
      
  3. 检查指令包格式和校验和计算

    • 确保发送的指令包符合 AS608 通讯协议,包括包头、地址、包标识、包长度、指令码、参数、校验和。

    • 修改 AS608_SendCommand 函数中的校验和计算方式:

      // 计算校验和
      checksum = packet[6] + packet[7] + packet[8];
      for (uint16_t i = 9; i < 10 + parameter_length; i++)
      {checksum += packet[i];
      }
      
  4. 增加调试信息

    • 在关键步骤中,通过 OLED 显示接收到的确认码,便于判断问题所在。

      OLED_ShowString(3, 1, "Ack: ");
      OLED_ShowHexNum(3, 6, buffer[9], 2);
      
  5. 增加超时和错误处理机制

    • 在等待指纹输入和接收模块响应时,增加重试次数,避免程序陷入死循环。

      uint8_t retry = 0;
      do
      {// 发送指令并接收响应// ...retry++;
      } while (retry < 10);
      
  6. 检查指纹模块工作状态

    • 确认指纹模块的供电电压为 3.3V,且电源足够稳定。

    • 如果指纹库已满,尝试清空指纹库:

      uint8_t AS608_EmptyLibrary(void)
      {uint8_t buffer[32];uint16_t length;AS608_SendCommand(PS_Empty, NULL, 0);uint8_t ack = AS608_ReceivePacket(buffer, &length);if (ack == 0 && buffer[9] == ACK_SUCCESS){return 0; // 成功}else{return 1; // 失败}
      }
      
  7. 使用最小化测试代码进行验证

    • 编写简单的测试程序,仅发送 PS_GetImage 指令,查看是否能收到正确的响应。

      int main(void)
      {// 初始化外设OLED_Init();AS608_Init();OLED_ShowString(1, 1, "AS608 Test:");while(1){OLED_ShowString(2, 1, "Testing...   ");AS608_SendCommand(PS_GetImage, NULL, 0);uint8_t buffer[32];uint16_t length;uint8_t ack = AS608_ReceivePacket(buffer, &length);if (ack == 0){OLED_ShowString(3, 1, "Ack: ");OLED_ShowHexNum(3, 6, buffer[9], 2);if (buffer[9] == ACK_SUCCESS){OLED_ShowString(4, 1, "GetImage OK ");}else{OLED_ShowString(4, 1, "GetImage Fail");}}else{OLED_ShowString(3, 1, "No Response  ");}Delay_s(2);}
      }
      

总结

通过对硬件连接、USART 通讯配置、指令包格式、接收函数以及错误处理机制的逐一检查和改进,成功实现了 AS608 指纹模块在 STM32 上的指纹录入和识别功能。

在调试过程中,遇到类似的问题时,应从硬件和软件两个方面入手,逐步排查。同时,增加调试信息和错误处理机制,可以大大提高调试效率。

注意事项

  • 确保指纹模块的电源供电稳定。
  • 遵循 AS608 通讯协议,正确组建指令包和解析响应包。
  • USART 接收函数需要考虑超时和异常情况。

参考资料

  • AS608 指纹模块数据手册
  • STM32F10x 标准外设库参考手册
  • UART 通讯协议和调试方法

相关文章:

STM32 与 AS608 指纹模块的调试与应用

前言 在嵌入式系统中&#xff0c;指纹识别作为一种生物识别技术&#xff0c;广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块&#xff0c;实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…...

腾讯PHP经典面试题(附答案)

腾讯PHP经典面试题&#xff08;附答案&#xff09; PHP开发工程师笔试试卷 姓名:PHP 一、PHP开发部分 1&#xff0e;合并两个数组有几种方式&#xff0c;试比较它们的异同 答&#xff1a; 1、array_merge() 2、’’ 3、array_merge_recursive array_merge 简单的合并数…...

LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)

一、引言 1.1 医疗数据挖掘的重要性与挑战 在当今数字化医疗时代,医疗数据呈爆炸式增长,这些数据蕴含着丰富的信息,对医疗决策具有极为重要的意义。通过对医疗数据的深入挖掘,可以发现潜在的疾病模式、治疗效果关联以及患者的健康风险因素,从而为精准医疗、个性化治疗方…...

【PCIe 总线及设备入门学习专栏 1.1 -- PCIe 基础知识 lane和link介绍】

文章目录 OverivewLane 和 LinkRC 和 RPPCIe controllerPCIE ControllerPHY模块 Inbound 和 OutboundPCIe transaction modelPIODMAP2P Overivew PCIe&#xff0c;即PCI-Express总线&#xff08;Peripheral Component Interconnect Express&#xff09;&#xff0c;是一种高速…...

PCDN 适合哪些人群?

家用宽带用户:对于家中有宽带&#xff0c;且宽带闲置时间较多的用户来说&#xff0c;PCDN是一个非常好的赚钱方式。只要你有足够的带宽和一台稳定的设备&#xff0c;就可以轻松参与。 小型网络运营者:如果你是小型网络运营者&#xff0c;拥有大量的闲置带宽资源PCDN 可以帮助你…...

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现&#xff0c;在此基础上&#xff0c;我们本期将学习另一个数据结构-…...

一分钟快速解读LEED绿色建筑认证

一分钟快速解读LEED绿色建筑认证——引领未来建筑绿色革命的风向标 LEED&#xff0c;全称为“Leadership in Energy and Environmental Design”&#xff0c;是美国绿色建筑委员会&#xff08;USGBC&#xff09;开发并推广的一套国际公认的绿色建筑评估体系。它如同一座灯塔&am…...

C# 语法糖集锦

文章目录 1、自动属性(Auto - Properties)2、对象和集合初始化器(Object and Collection Initializers)3、匿名类型(Anonymous Types)4、扩展方法(Extension Methods)5、Lambda 表达式(Lambda Expressions)6、空合并运算符(??)和空条件运算符(?.)7、隐式类型数…...

centos制作离线安装包

目录 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择&#xff1f; yumdownloader --resolve 和 repotrack 都是与 YUM&#xff08;Yellowdog Updater Modified&#xf…...

HTML5 学习资源

HTML5 学习资源 学习HTML5的资源丰富多样&#xff0c;以下是一些推荐的在线教程、书籍和社区论坛&#xff0c;帮助你更好地掌握HTML5。 11.1 在线教程和课程 MDN Web Docs&#xff1a; MDN HTML 教程提供详细的HTML5文档和实例&#xff0c;适合各个水平的开发者。 W3Schools…...

大模型(LLM)提示工程(Prompt Engineering)初识

大模型提示工程&#xff08;Prompt Engineering&#xff09;是指设计和优化给定任务的输入提示&#xff0c;以便从大型语言模型&#xff08;如GPT-4、GPT-3等&#xff09;中获得最佳输出。其核心目标是通过合理设计输入内容&#xff08;提示词或提示结构&#xff09;&#xff0…...

uni-app 统一请求处理 请求拦截器 响应拦截器 请求封装

封装API接口 import {http} from ../utils/request.js export function login(code){return http({url:/wx/getSession,method: GET,data:{code}}) }调用接口 import {login,test,phoneMessage,updateAvatar} from ../../api/user.js function userLogin(){ login(code.value…...

web 渗透学习指南——初学者防入狱篇

目录 一、学习方向和基础知识二、知识点详细总结三、学习流程和典型案例 案例1&#xff1a;SQL注入漏洞检测与利用案例2&#xff1a;XSS攻击检测与利用案例3&#xff1a;文件上传漏洞利用案例4&#xff1a;CSRF攻击实现 四、常用工具推荐和使用方法五、初学者实用学习资源六、渗…...

卷积神经网络入门指南:从原理到实践

目录 1 CNN的发展历史 2 CNN的基本原理 3 CNN核心组件 3.1 卷积操作基础 3.2 卷积层详解 3.3 高级卷积操作 3.3.1 分组卷积&#xff08;Group Convolution&#xff09; 3.3.2 深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;&#xff1a; 3.3 池…...

vscode添加全局宏定义

利用vscode编辑代码时&#xff0c;设置了禁用非活动区域着色后&#xff0c;在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色&#xff0c;想查看代码不是很方便。如下图&#xff1a; 一 解决&#xff1a; 在vscode中添加全局宏定义。 二 步骤&#xff1a…...

Mysql InnoDB存储引擎中聚簇索引和非聚簇索引的区别

最核心的区别还是从需求角度来看比较好&#xff1a; 1.创建索引时 在创建表时&#xff0c;InnoDB存储引擎会根据不同情况&#xff0c;选择不同的列作为索引 &#xff08;1&#xff09;有主键&#xff0c;通过主键作为聚簇索引的索引键&#xff08;key) &#xff08;2&#xf…...

使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效

使用vcpkg安装opencv>4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效\无法查找或打开 至少从2024年开始&#xff0c;发布的vcpkg默认安装的opencv版本都是4.x版。4.8版本及以前&#xff0c;vcpkg编译后的opencv头文件目录是*/vcpkg/x64-win…...

opencv sdk for java中提示无stiching模块接口的问题

1、问题介绍 安卓项目中有新的需求&#xff0c;在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时&#xff0c;出现大量报错&#xff0c;如下截图所示 实际上&#xff0c;其他opencv的接口函数 例如 core dnn等都能正常使用&#xff0c;直觉上初步怀疑 ope…...

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…...

gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘

首次克隆仓库&#xff0c;失效了&#xff0c;上网查方法&#xff0c;都说是网络代理的问题&#xff0c;各种清理网络代理后都无效&#xff0c;去问同事&#xff1a; 先前都是直接复制的网页url当做远端url&#xff0c;或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…...

代码随想录day27 贪心1

题目&#xff1a;455.分发饼干 376.摆动序列 53.最大子序和 需要重做&#xff1a;全部 贪心算法其实就是没有什么规律可言&#xff0c;所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律&#xff0c; 没有思路就立刻看题解。 理论基础 贪心的…...

Hive 部署

1 下载并安装 1.1 Hadoop安装 参考另一篇博客&#xff1a;Hadoop 部署 1.2 安装包下载 可通过下面网站下载&#xff1a; 官网&#xff1a;https://dlcdn.apache.org/hive/。清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…...

SDK 指南

在前端开发中&#xff0c;SDK&#xff08;Software Development Kit&#xff0c;软件开发工具包&#xff09;是一个用于帮助开发者在特定平台、框架或技术栈中实现某些功能的工具集。 1. SDK 是什么&#xff1f; SDK 是一种开发工具包&#xff0c;它提供了开发人员实现某些功…...

unity Default constructor not found for type 的问题

文章目录 前言一、怎么解决&#xff1f;总结 前言 突然有一次打包PC的包出来&#xff0c;JSON就无法正常获取&#xff0c;后来找到原因&#xff1a; 应该是设置渲染等级相关的东西&#xff0c;不小心把剥离等级设置套高了。 一般情况不会出现&#xff0c;向我这种老爱unity 编…...

富文本编辑器实现表单非空校验

首先尝试使用form的rules规则去验证&#xff0c;发现未生效&#xff1b; <el-form ref"form" :disabled"readonly" :model"form" :rules"rules" label-width"120px"><el-form-item label"内容" prop&quo…...

使用uniapp开发微信小程序-框架搭建

最近要开发一个小程序&#xff0c;为了降低学习成本&#xff0c;最后还是选择使用uniapp来开发&#xff0c;但是由于电脑性能不行&#xff0c;实在不想多跑一个应用程序&#xff0c;就简单搭建了一个可以用vscode跑的uniapp项目。 项目整体技术栈&#xff1a;vue3 pinia type…...

华为浏览器(HuaweiBrowser),简约高效上网更轻松

华为浏览器是一款由华为公司自主研发的网页浏览工具&#xff0c;凭借其独特的设计理念和优质的用户体验&#xff0c;正在吸引越来越多的用户关注。这款基于Chromium技术打造的浏览器不仅继承了Chrome的高性能特质&#xff0c;更融入了华为自身的创新元素&#xff0c;为用户打造…...

SQLite

文章目录 1、什么是信息?2、 数据库模型3、sqLite 数据库4、 SQL 语句基础5、对数据库文件 SQL 语句:6、创建表:create 语句7、创建表:create 语句(设置主键)8、查看表: .table9、修改表: alter语句10、删除表:drop table 语句11、插入新行:insert into 语句(全部赋值)12、插入…...

uniapp下拉选择组件

目录 背景 实现思路 代码实现 配置项 使用 尾巴 背景 最近遇到一个这样的需求&#xff0c;在输入框中输入关键字&#xff0c;通过接口查询到结果之后&#xff0c;以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库&#xff0c;没找到符合条件的…...

解决 vue3 中 echarts图表在el-dialog中显示问题

原因&#xff1a; 第一次点开不显示图表&#xff0c;第二次点开虽然显示图表&#xff0c;但是图表挤在一起&#xff0c;页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成&#xff0c;而你的 echarts 组件已经开始尝试渲染图…...

WebSSH:基于Go实现的高效Web SSH客户端指南

WebSSH&#xff1a;基于Go实现的高效Web SSH客户端指南 WebSSH 功能强大&#xff0c;Go 实现的一个WebSSH&#xff0c;支持文件上传下载 [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/webssh1/WebSSH 项目基础介绍&#xff1a; WebSSH是一个由Golang编写的高效…...

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1&#xff09;导出数据到本地目录 2&#xff09;导出到hdfs的目录下 3&#xff09;直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…...

shell脚本定义特殊字符导致执行mysql文件错误的问题

记得有一次版本发布过程中有提供一个sh脚本用于一键执行sql文件&#xff0c;遇到一个shell脚本定义特殊字符的问题&#xff0c;sh脚本的内容类似以下内容&#xff1a; # 数据库ip地址 ip"127.0.0.1" # 数据库密码 cmdbcmdb!#$! smsm!#$!# 执行脚本文件&#xff08;参…...

【从零开始入门unity游戏开发之——C#篇29】C#泛型(T)和 泛型约束

文章目录 一、泛型1、泛型是什么2、泛型分类2.1. **泛型类和泛型接口**2.2. **泛型方法** 3、泛型类和接口3.1 泛型类示例&#xff1a;3.2 泛型接口示例&#xff1a;3.3 泛型类接受多个类型参数&#xff1a; 4、泛型方法4.1. **普通类中的泛型方法**4.2. **泛型类中的泛型方法*…...

一个从oracle使用spool导出数据到kadb的脚本

1. dump_data.sh调用sql_dump.sh导出数据 2. load_data.sh将导出的数据加载至KADB 1. dump_data.sh #!/bin/bash begin_time$(date %Y%m%d -d -1 day) end_time$(date %Y%m%d) echo "数据导出日期:"$begin_time echo "数据导出日期:"$begin_time >>…...

两道数组有关的OJ练习题

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…...

仿闲鱼的二手交易小程序软件开发闲置物品回收平台系统源码

市场前景 闲置物品交易软件的市场前景广阔&#xff0c;主要基于以下几个方面的因素&#xff1a; 环保意识提升&#xff1a;随着人们环保意识的增强&#xff0c;越来越多的人开始关注资源的循环利用&#xff0c;闲置物品交易因此受到了广泛的关注。消费升级与时尚节奏加快&…...

uni-app使用组件button遇到的问题

在HBuilder X工具中新建一个空白项目&#xff0c; 1、新建一个about页 然后在pages.json文件里加上路由 2、然后看下导航的方法&#xff0c;发现找不到navigateTo方法 参考&#xff1a;button | uni-app官网 第3行和第4行的代码倒是没问题的&#xff0c;第5行的代码有问题执行…...

halcon单相机+机器人*眼在手外标定心得

目的 得到相机坐标系下的点与机器人底座base的转换关系&#xff0c;camera_in_base 两个不确定的定量 1&#xff0c;相机与机器人底座base之间的相对位置是固定的&#xff0c;既camera_in_base 2&#xff0c;机械手末端与标定物 tool_in_obj是固定的 辅助确定量 工作台与相…...

为什么在多数据源的情况下,单数据源的自动配置类会失效?

在 Spring Boot 中&#xff0c;DataSourceAutoConfiguration 是单数据源情况下的默认自动配置类。当引入多数据源方案&#xff08;例如 dynamic-datasource-spring-boot-starter&#xff09;后&#xff0c;单数据源的自动配置机制会失效&#xff0c;原因主要在于多数据源自动配…...

Y3编辑器教程8:资源管理器与存档、防作弊设置

文章目录 一、资源管理器简介1.1 界面介绍1.2 资源商店1.3 AI专区1.3.1 AI文生图1.3.2 AI图生图1.3.3 立绘头像 二、导入导出2.1 文件格式2.2 模型导入2.2.1 模型制作后导出2.2.2 模型文件导入Y3编辑器2.2.3 Y3编辑器角色、装饰物模型要求 2.3 纹理导入2.4 材质贴图2.4.1 材质支…...

域名劫持污染可以拦截吗?

在当今数字化的时代&#xff0c;互联网已经成为人们生活、工作和学习不可或缺的一部分。然而&#xff0c;网络世界并非一片净土&#xff0c;域名劫持污染这一威胁如同潜藏在暗处的 “幽灵”&#xff0c;时刻困扰着网络的安全与稳定&#xff0c;也引发了人们对于其是否可以被有效…...

解决“SVN无法上传或下载*.so、*.a等二进制文件“问题

今天&#xff0c;在使用Subversion提交代码到服务器时&#xff0c;发现无法提交*.a、*.so等二进制文件&#xff0c;右击这些文件&#xff0c;发现其属性为ignores。     问题原因&#xff1a;SVN的配置文件里&#xff0c;屏蔽了*.a、*.so文件的上传与下载&#xff0c;并把这些…...

2024年河北省职业院校技能大赛云计算应用赛项赛题第2套(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…...

登山第十六梯:深度恢复——解决机器人近视问题

文章目录 一 摘要 二 资源 三 内容 一 摘要 深度感知是基于 3D 视觉的机器人技术的一个重要问题。然而&#xff0c;现实世界的主动立体或 ToF 深度相机经常会产生嘈杂且深度不完整&#xff0c;从而成为机器人性能的瓶颈。在这项工作中&#xff0c;提出了 一个基于学习的立体…...

【自动驾驶】3 激光雷达③

5 激光雷达点云检测模型 &#x1f98b;&#x1f98b;&#x1f98b;CenterPoint是Anchor‐Free的3D物体检测器&#xff0c;以点云作为输入&#xff0c;将三维物体在Bird‐View下的中心点作为关键点&#xff0c;基于关键点检测的方式回归物体的尺寸、方向和速度。相比于Anchor‐…...

新手福音:有哪些比Zotero更友好的文献管理软件?

别找了&#xff0c;3个被夸上天的论文阅读神器&#xff0c;我都帮你测评好了&#xff0c;直接抄我作业&#xff01;&#xff01; Scholaread、Zotero和EndNote&#xff0c;这些工具在复杂的学术探索中给我点亮了一盏灯&#xff0c;那感觉棒极了&#xff01; 虽然每个工具都不…...

消费导刊杂志社消费导刊杂志消费导刊编辑部2024年第41期目录

征稿启事 封2 轻工艺术 浅谈青瓷创作中的艺术审美 周水淼1-4 浅谈木雕艺术在红木家具创作中的应用 蒋宝良5-8 浅谈对唐卡艺术高技能人才培养的必要性 夏吾他9-12 龙泉宝剑锻造技艺 叶明13-16 传承吸纳,创造吐新——论越窑青瓷新时代的传承和创新路径 盛海尧17-20 浅析龙泉哥窑艺…...

Datawhale-AI活动2024.12.24

目录 一、番茄时钟&#xff08;1&#xff09;输入Prompt&#xff08;2&#xff09;创建 HTML 文件解析1&#xff1a;HTML结构解析2&#xff1a;计时器内容解析3&#xff1a;按钮区域解析4&#xff1a;脚本引用 &#xff08;3&#xff09;使用JavaScript实现时钟功能解析1&#…...

揭秘:薪酬绩效管理咨询公司收费标准

在当今这个竞争激烈的商业环境中&#xff0c;企业的人力资源管理变得尤为重要&#xff0c;尤其是薪酬绩效管理体系的构建与优化。一个合理的薪酬绩效管理制度不仅能激发员工的积极性与创造力&#xff0c;还能帮助企业实现战略目标&#xff0c;提升整体竞争力。然而&#xff0c;…...