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 显示屏的驱动代码。
主程序流程
- 初始化外设:OLED 显示屏、USART2(用于与 AS608 通信)等。
- 等待 3 秒:给用户准备时间。
- 指纹录入:
- 提示用户放置手指。
- 获取指纹图像,并生成特征文件。
- 提示用户再次放置手指,重复上述步骤。
- 合成指纹模板并存储到指纹库中。
- 等待 2 秒。
- 指纹识别:
- 提示用户放置手指。
- 获取指纹图像,生成特征文件。
- 在指纹库中搜索匹配的指纹。
- 显示识别结果(匹配的指纹 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
提示,无法继续。这表明程序可能在等待指纹模块的响应,但未能收到正确的数据。
可能原因
-
USART 通讯问题:
- 波特率设置不正确。
- USART 引脚连接错误。
- USART 接收函数未正确实现。
-
指令包格式错误:
- 指令包中的参数、校验和计算错误。
- 未正确按照 AS608 通讯协议发送和接收数据。
-
指纹模块未正常工作:
- 模块损坏或供电不足。
- 指纹库已满或需要初始化。
解决方案
-
检查 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
-
-
改进接收函数
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); }
-
-
检查指令包格式和校验和计算:
-
确保发送的指令包符合 AS608 通讯协议,包括包头、地址、包标识、包长度、指令码、参数、校验和。
-
修改
AS608_SendCommand
函数中的校验和计算方式:// 计算校验和 checksum = packet[6] + packet[7] + packet[8]; for (uint16_t i = 9; i < 10 + parameter_length; i++) {checksum += packet[i]; }
-
-
增加调试信息:
-
在关键步骤中,通过 OLED 显示接收到的确认码,便于判断问题所在。
OLED_ShowString(3, 1, "Ack: "); OLED_ShowHexNum(3, 6, buffer[9], 2);
-
-
增加超时和错误处理机制:
-
在等待指纹输入和接收模块响应时,增加重试次数,避免程序陷入死循环。
uint8_t retry = 0; do {// 发送指令并接收响应// ...retry++; } while (retry < 10);
-
-
检查指纹模块工作状态:
-
确认指纹模块的供电电压为 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; // 失败} }
-
-
使用最小化测试代码进行验证:
-
编写简单的测试程序,仅发送
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 指纹模块的调试与应用
前言 在嵌入式系统中,指纹识别作为一种生物识别技术,广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块,实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…...
腾讯PHP经典面试题(附答案)
腾讯PHP经典面试题(附答案) PHP开发工程师笔试试卷 姓名:PHP 一、PHP开发部分 1.合并两个数组有几种方式,试比较它们的异同 答: 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,即PCI-Express总线(Peripheral Component Interconnect Express),是一种高速…...
PCDN 适合哪些人群?
家用宽带用户:对于家中有宽带,且宽带闲置时间较多的用户来说,PCDN是一个非常好的赚钱方式。只要你有足够的带宽和一台稳定的设备,就可以轻松参与。 小型网络运营者:如果你是小型网络运营者,拥有大量的闲置带宽资源PCDN 可以帮助你…...
C++之红黑树模拟实现
目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现,在此基础上,我们本期将学习另一个数据结构-…...
一分钟快速解读LEED绿色建筑认证
一分钟快速解读LEED绿色建筑认证——引领未来建筑绿色革命的风向标 LEED,全称为“Leadership in Energy and Environmental Design”,是美国绿色建筑委员会(USGBC)开发并推广的一套国际公认的绿色建筑评估体系。它如同一座灯塔&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怎么选择? yumdownloader --resolve repotrack 总结 2.环境准备 3.安装 1.yumdownloader与repotrack怎么选择? yumdownloader --resolve 和 repotrack 都是与 YUM(Yellowdog Updater Modified…...
HTML5 学习资源
HTML5 学习资源 学习HTML5的资源丰富多样,以下是一些推荐的在线教程、书籍和社区论坛,帮助你更好地掌握HTML5。 11.1 在线教程和课程 MDN Web Docs: MDN HTML 教程提供详细的HTML5文档和实例,适合各个水平的开发者。 W3Schools…...
大模型(LLM)提示工程(Prompt Engineering)初识
大模型提示工程(Prompt Engineering)是指设计和优化给定任务的输入提示,以便从大型语言模型(如GPT-4、GPT-3等)中获得最佳输出。其核心目标是通过合理设计输入内容(提示词或提示结构)࿰…...
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:SQL注入漏洞检测与利用案例2:XSS攻击检测与利用案例3:文件上传漏洞利用案例4:CSRF攻击实现 四、常用工具推荐和使用方法五、初学者实用学习资源六、渗…...
卷积神经网络入门指南:从原理到实践
目录 1 CNN的发展历史 2 CNN的基本原理 3 CNN核心组件 3.1 卷积操作基础 3.2 卷积层详解 3.3 高级卷积操作 3.3.1 分组卷积(Group Convolution) 3.3.2 深度可分离卷积(Depthwise Separable Convolution): 3.3 池…...
vscode添加全局宏定义
利用vscode编辑代码时,设置了禁用非活动区域着色后,在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色,想查看代码不是很方便。如下图: 一 解决: 在vscode中添加全局宏定义。 二 步骤:…...
Mysql InnoDB存储引擎中聚簇索引和非聚簇索引的区别
最核心的区别还是从需求角度来看比较好: 1.创建索引时 在创建表时,InnoDB存储引擎会根据不同情况,选择不同的列作为索引 (1)有主键,通过主键作为聚簇索引的索引键(key) (2…...
使用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年开始,发布的vcpkg默认安装的opencv版本都是4.x版。4.8版本及以前,vcpkg编译后的opencv头文件目录是*/vcpkg/x64-win…...
opencv sdk for java中提示无stiching模块接口的问题
1、问题介绍 安卓项目中有新的需求,在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时,出现大量报错,如下截图所示 实际上,其他opencv的接口函数 例如 core dnn等都能正常使用,直觉上初步怀疑 ope…...
大恒相机开发(2)—Python软触发调用采集图像
大恒相机开发(2)—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码: # version:…...
gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘
首次克隆仓库,失效了,上网查方法,都说是网络代理的问题,各种清理网络代理后都无效,去问同事: 先前都是直接复制的网页url当做远端url,或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…...
代码随想录day27 贪心1
题目:455.分发饼干 376.摆动序列 53.最大子序和 需要重做:全部 贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。 理论基础 贪心的…...
Hive 部署
1 下载并安装 1.1 Hadoop安装 参考另一篇博客:Hadoop 部署 1.2 安装包下载 可通过下面网站下载: 官网:https://dlcdn.apache.org/hive/。清华源:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…...
SDK 指南
在前端开发中,SDK(Software Development Kit,软件开发工具包)是一个用于帮助开发者在特定平台、框架或技术栈中实现某些功能的工具集。 1. SDK 是什么? SDK 是一种开发工具包,它提供了开发人员实现某些功…...
unity Default constructor not found for type 的问题
文章目录 前言一、怎么解决?总结 前言 突然有一次打包PC的包出来,JSON就无法正常获取,后来找到原因: 应该是设置渲染等级相关的东西,不小心把剥离等级设置套高了。 一般情况不会出现,向我这种老爱unity 编…...
富文本编辑器实现表单非空校验
首先尝试使用form的rules规则去验证,发现未生效; <el-form ref"form" :disabled"readonly" :model"form" :rules"rules" label-width"120px"><el-form-item label"内容" prop&quo…...
使用uniapp开发微信小程序-框架搭建
最近要开发一个小程序,为了降低学习成本,最后还是选择使用uniapp来开发,但是由于电脑性能不行,实在不想多跑一个应用程序,就简单搭建了一个可以用vscode跑的uniapp项目。 项目整体技术栈:vue3 pinia type…...
华为浏览器(HuaweiBrowser),简约高效上网更轻松
华为浏览器是一款由华为公司自主研发的网页浏览工具,凭借其独特的设计理念和优质的用户体验,正在吸引越来越多的用户关注。这款基于Chromium技术打造的浏览器不仅继承了Chrome的高性能特质,更融入了华为自身的创新元素,为用户打造…...
SQLite
文章目录 1、什么是信息?2、 数据库模型3、sqLite 数据库4、 SQL 语句基础5、对数据库文件 SQL 语句:6、创建表:create 语句7、创建表:create 语句(设置主键)8、查看表: .table9、修改表: alter语句10、删除表:drop table 语句11、插入新行:insert into 语句(全部赋值)12、插入…...
uniapp下拉选择组件
目录 背景 实现思路 代码实现 配置项 使用 尾巴 背景 最近遇到一个这样的需求,在输入框中输入关键字,通过接口查询到结果之后,以下拉框列表形式展现供用户选择。查询了下uni-app官网和项目中使用的uv-ui库,没找到符合条件的…...
解决 vue3 中 echarts图表在el-dialog中显示问题
原因: 第一次点开不显示图表,第二次点开虽然显示图表,但是图表挤在一起,页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成,而你的 echarts 组件已经开始尝试渲染图…...
WebSSH:基于Go实现的高效Web SSH客户端指南
WebSSH:基于Go实现的高效Web SSH客户端指南 WebSSH 功能强大,Go 实现的一个WebSSH,支持文件上传下载 [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/webssh1/WebSSH 项目基础介绍: WebSSH是一个由Golang编写的高效…...
Hive其四,Hive的数据导出,案例展示,表类型介绍
目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…...
shell脚本定义特殊字符导致执行mysql文件错误的问题
记得有一次版本发布过程中有提供一个sh脚本用于一键执行sql文件,遇到一个shell脚本定义特殊字符的问题,sh脚本的内容类似以下内容: # 数据库ip地址 ip"127.0.0.1" # 数据库密码 cmdbcmdb!#$! smsm!#$!# 执行脚本文件(参…...
【从零开始入门unity游戏开发之——C#篇29】C#泛型(T)和 泛型约束
文章目录 一、泛型1、泛型是什么2、泛型分类2.1. **泛型类和泛型接口**2.2. **泛型方法** 3、泛型类和接口3.1 泛型类示例:3.2 泛型接口示例:3.3 泛型类接受多个类型参数: 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练习题
系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...
仿闲鱼的二手交易小程序软件开发闲置物品回收平台系统源码
市场前景 闲置物品交易软件的市场前景广阔,主要基于以下几个方面的因素: 环保意识提升:随着人们环保意识的增强,越来越多的人开始关注资源的循环利用,闲置物品交易因此受到了广泛的关注。消费升级与时尚节奏加快&…...
uni-app使用组件button遇到的问题
在HBuilder X工具中新建一个空白项目, 1、新建一个about页 然后在pages.json文件里加上路由 2、然后看下导航的方法,发现找不到navigateTo方法 参考:button | uni-app官网 第3行和第4行的代码倒是没问题的,第5行的代码有问题执行…...
halcon单相机+机器人*眼在手外标定心得
目的 得到相机坐标系下的点与机器人底座base的转换关系,camera_in_base 两个不确定的定量 1,相机与机器人底座base之间的相对位置是固定的,既camera_in_base 2,机械手末端与标定物 tool_in_obj是固定的 辅助确定量 工作台与相…...
为什么在多数据源的情况下,单数据源的自动配置类会失效?
在 Spring Boot 中,DataSourceAutoConfiguration 是单数据源情况下的默认自动配置类。当引入多数据源方案(例如 dynamic-datasource-spring-boot-starter)后,单数据源的自动配置机制会失效,原因主要在于多数据源自动配…...
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 材质支…...
域名劫持污染可以拦截吗?
在当今数字化的时代,互联网已经成为人们生活、工作和学习不可或缺的一部分。然而,网络世界并非一片净土,域名劫持污染这一威胁如同潜藏在暗处的 “幽灵”,时刻困扰着网络的安全与稳定,也引发了人们对于其是否可以被有效…...
解决“SVN无法上传或下载*.so、*.a等二进制文件“问题
今天,在使用Subversion提交代码到服务器时,发现无法提交*.a、*.so等二进制文件,右击这些文件,发现其属性为ignores。 问题原因:SVN的配置文件里,屏蔽了*.a、*.so文件的上传与下载,并把这些…...
2024年河北省职业院校技能大赛云计算应用赛项赛题第2套(私有云)
#需要资源(软件包及镜像)或有问题的,可私聊博主!!! #需要资源(软件包及镜像)或有问题的,可私聊博主!!! #需要资源(软件包…...
登山第十六梯:深度恢复——解决机器人近视问题
文章目录 一 摘要 二 资源 三 内容 一 摘要 深度感知是基于 3D 视觉的机器人技术的一个重要问题。然而,现实世界的主动立体或 ToF 深度相机经常会产生嘈杂且深度不完整,从而成为机器人性能的瓶颈。在这项工作中,提出了 一个基于学习的立体…...
【自动驾驶】3 激光雷达③
5 激光雷达点云检测模型 🦋🦋🦋CenterPoint是Anchor‐Free的3D物体检测器,以点云作为输入,将三维物体在Bird‐View下的中心点作为关键点,基于关键点检测的方式回归物体的尺寸、方向和速度。相比于Anchor‐…...
新手福音:有哪些比Zotero更友好的文献管理软件?
别找了,3个被夸上天的论文阅读神器,我都帮你测评好了,直接抄我作业!! Scholaread、Zotero和EndNote,这些工具在复杂的学术探索中给我点亮了一盏灯,那感觉棒极了! 虽然每个工具都不…...
消费导刊杂志社消费导刊杂志消费导刊编辑部2024年第41期目录
征稿启事 封2 轻工艺术 浅谈青瓷创作中的艺术审美 周水淼1-4 浅谈木雕艺术在红木家具创作中的应用 蒋宝良5-8 浅谈对唐卡艺术高技能人才培养的必要性 夏吾他9-12 龙泉宝剑锻造技艺 叶明13-16 传承吸纳,创造吐新——论越窑青瓷新时代的传承和创新路径 盛海尧17-20 浅析龙泉哥窑艺…...
Datawhale-AI活动2024.12.24
目录 一、番茄时钟(1)输入Prompt(2)创建 HTML 文件解析1:HTML结构解析2:计时器内容解析3:按钮区域解析4:脚本引用 (3)使用JavaScript实现时钟功能解析1&#…...
揭秘:薪酬绩效管理咨询公司收费标准
在当今这个竞争激烈的商业环境中,企业的人力资源管理变得尤为重要,尤其是薪酬绩效管理体系的构建与优化。一个合理的薪酬绩效管理制度不仅能激发员工的积极性与创造力,还能帮助企业实现战略目标,提升整体竞争力。然而,…...