MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟
这次电赛题目选的简单了,还规定不能使用到摄像头,这让我之前学习的Opencv 4与树莓派无用武之地了,但我当时对于三子棋题目饶有兴趣,但架不住队友想稳奖,只能选择这个H题了......
之后我还想抽空将这个E题三子棋题目做做,写篇博客实现一下......
这篇文就将一些过程中 遇到的问题 与 可能的解决法 讲一下.....
目录
MSPM0G3507库函数问题与修改:
端口状态读取函数问题:
串口接收函数存在强制类型转换:
汇编文件定义的数据处理栈过小:
直流电机干扰磁场:
题目思路:
PID角度惯导:
PID角度惯导视频:
第一题:
第一题视频:
第二题:
第二题视频:
第三题:
第三题视频:
主函数与状态安排:
网上查阅资料贴出:
MSPM0G3507库函数问题与修改:
端口状态读取函数问题:
在尝试通过读取引脚高低电平来获取八路寻迹的端口状态时,发现它的引脚读取函数设计有些奇特,返回值不是类似于STM32的那种0和1,
我们发现 DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_15) ,低电平就返回0,而高电平返回的不是1,而是引脚的编号......
串口接收函数存在强制类型转换:
在使用串口时发现 STATIC INLINE uint8 t DL UART receiveData(UART Regs *uart)
存在强制类型转换的现象:
这会将十六进制发送过来的数据强制转换为0~255的十进制数据,这是个多此一举的冗余步骤
随后去掉了这个强制类型转换:
汇编文件定义的数据处理栈过小:
在进行串口与数据接收时,我写了一个函数用于解算数据包以及计算角度,没想到在进行通信测试时,串口一直没有执行printf返回给上位机任何数据,后来才发现是在解算步骤卡住了:
以下是我解算JY901B陀螺仪 数据包定义的数据变量与函数,该函数在串口中断中调用:
数据变量:
最终结算好的数据存在了float Angle_R[3];中
#include <string.h>uint8_t RX_BUFFER[10];typedef struct {float angle[3]; }Angle;struct SAngle//角度 {short Angle[3];short T; };struct SAngle stcAngle; float Angle_R[3];void JY901_Process(uint8_t RxData);
函数:
void JY901_Process(uint8_t RxData) {static uint8_t state=0;static uint8_t bufsize=0;switch(state){case 0://搜索到帧头if(RxData==0x55) { state=1;}else state=0;break;case 1://搜索到角度帧if(RxData==0x53) { state=2;}else state=0; //否则重新搜素break;case 2:RX_BUFFER[bufsize]=RxData;bufsize++;if(bufsize==9){state=3;bufsize=0;}break;case 3:memcpy(&stcAngle,&RX_BUFFER[0],8);for(uint8_t j = 0; j < 3; j++){Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;}state = 0;break;}}
随后为了解决这个问题,将汇编文件的栈大小进行了修改:
修改后:
直流电机干扰磁场:
中途发现陀螺仪存在左右飘逸的现象,起初怀疑是直流电机磁场对它有影响,就将直流电机的外壳接地了,结果发现影响更大了,就不在接地了.....
题目思路:
PID角度惯导:
这是将电机速度闭环之后,再对角度闭环的结果:可以使小车保持在一个角度:
//用于初始化pid参数的函数 void PID_Init(PID *pid, float p, float i, float d, float maxI, float maxOut) {pid->kp = p;pid->ki = i;pid->kd = d;pid->maxIntegral = maxI;pid->maxOutput = maxOut; }//进行一次pid计算 //参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中 void PID_Calc(PID *pid, float reference, float feedback) {//更新数据pid->lastError = pid->error; //将旧error存起来pid->error = reference - feedback; //计算新error//计算微分float dout = (pid->error - pid->lastError) * pid->kd;//计算比例float pout = pid->error * pid->kp;//计算积分pid->integral += pid->error * pid->ki;//积分限幅if(pid->integral > pid->maxIntegral) pid->integral = pid->maxIntegral;else if(pid->integral < -pid->maxIntegral) pid->integral = -pid->maxIntegral;//计算输出pid->output = pout+dout + pid->integral;//输出限幅if(pid->output > pid->maxOutput) pid->output = pid->maxOutput;else if(pid->output < -pid->maxOutput) pid->output = -pid->maxOutput; }//首先定义PID结构体用于存放一个PID的数据 typedef struct {float kp, ki, kd; //三个系数float error, lastError; //误差、上次误差float integral, maxIntegral; //积分、积分限幅float output, maxOutput; //输出、输出限幅 }PID;PID mypid = {0}; //创建一个PID结构体变量 PID_Init(&mypid, 1.5, 0, 3, 80, 100); //初始化PID参数
角度PID计算惯导部分:
char imu2(float angle) {char flag = 0;float chazhi_angle;chazhi_angle = fabs(Angle_R[2] - angle);targetValue=angle;float feedbackValue = Angle_R[2]; //这里获取到被控对象的反馈值PID_Calc(&mypid, targetValue, feedbackValue); //进行PID计算,结果在output成员变量设定执行器输出大小(mypid.output);SPEEED[0]=mypid.output;SPEEED[1]=mypid.output*(-1);SPEEED[2]=mypid.output;SPEEED[3]=mypid.output*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动if(chazhi_angle<3) {return 1;}return 0; }
PID角度惯导视频:
PID角度惯导视频
第一题:
就将小车四个电机闭环,保持同速即可,使用状态机的思维去写的,写一个状态就测试一次小车的具体运行程序结果,看是否需要添加或修改其余传感器逻辑......
这里我有个空闲状态,一旦切换到空闲状态,小车就会对0度进行角度惯导......
//任务1
void TASK_1(void)
{GET_FTT_PORT_status();if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_16)==0){beep(1);led(1); delay_ms(10); beep(0);led(0);status1 =1;status3=99;}//选择状态进入switch(status1){case 0:target_angle_F=1;target_angle=0;system_idie_state(); break; //系统空闲状态:case 1: //无脑直线 //GET_FTT_PORT_status();target_angle_F=0;target_angle=0; SPEEED[0]=45*(-1);SPEEED[1]=45;SPEEED[2]=45;SPEEED[3]=45*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动//任意检测到线if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1){SPEEED[0]=0;SPEEED[1]=0;SPEEED[2]=0;SPEEED[3]=0;I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动beep(1);led(1);delay_ms(15);beep(0);led(0);status1=0;}break;}
}
第一题视频:
2024电赛自动行驶小车(H题)_第一问
第二题:
这题的A->B部分就是先靠PID直线,然后巡线,然后想办法通过陀螺仪反馈使小车转到差不多180度的位置,陀螺仪因为读取方式不同,其实转到180度正还是不容易的......
然后我定的是-178度位置,为了防止它缓慢偏出线,我又增加了179的惯导在直行的逻辑中,(但这样简单粗暴的添加使得我的小车挺抖......)
//任务2 不许删动 //放置时 先正放再 向左边斜放 void TASK_2(void) {GET_FTT_PORT_status(); //获得巡线返回if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_15)==0){ beep(1);led(1); delay_ms(10); beep(0);led(0); status2=1;status1=99;status3=99;}switch (status2){case 0:system_idie_state(); break;case 1://A->B 无脑直线 target_angle_F=0;//imu2(0); //惯导直行SPEEED[0]=45*(-1);SPEEED[1]=45;SPEEED[2]=45;SPEEED[3]=45*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动//任意检测到线if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1){beep(1);led(1);delay_ms(15);beep(0);led(0);status2=2;status=1;}break;case 2://B->C 巡线 FTT_judge_status();//判定巡线系统状态target_angle_F=0;// //先清零系统预设方向status_Direction=0;//八路寻迹判断系统状态,一般会传给status_Direction数值FTT_judge_status();//选择状态进入switch(status){case 0:system_idie_state(); break; //系统空闲状态:case 1:system_follow_straight();break; //系统直线寻迹状态(可带小弧度偏转) case 2:system_Turn_left(); break; //小车左转调整状态case 3:system_Turn_right(); break; //小车右转调整状态//case 4:system_stop(); break; //停车} //已经到C了if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2]+180)<=15)){beep(1);led(1);delay_ms(15);beep(0);led(0);//imu2(-60); //偏正//targetValue=-44;target_angle_F=0;while(imu2_my(-175)==0)status2=3;status=0; }//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0){//imu2(-120); //惯导偏正(向右) system_Turn_right();} break;case 3://C->D 无脑执行imu2_my(-177); //惯导直行 175SPEEED[0]=45*(-1);SPEEED[1]=45;SPEEED[2]=45;SPEEED[3]=45*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动//任意检测到线if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1){beep(1);led(1);delay_ms(15);beep(0);led(0);status2=4;status=1;}break;case 4://D->A // //先清零系统预设方向status_Direction=0;//八路寻迹判断系统状态,一般会传给status_Direction数值FTT_judge_status();//选择状态进入switch(status){case 0:system_idie_state(); break; //系统空闲状态:case 1:system_follow_straight();break; //系统直线寻迹状态(可带小弧度偏转) case 2:system_Turn_left(); break; //小车左转调整状态case 3:system_Turn_right(); break; //小车右转调整状态//case 4:system_stop(); break; //停车} //已经到A了if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])<=22)){SPEEED[0]=0;SPEEED[1]=0;SPEEED[2]=0;SPEEED[3]=0;I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动beep(1);led(1);delay_ms(15);beep(0);led(0);target_angle_F=0;target_angle=0;while(imu2_my(0)==0) //偏正status=0;status2=9;status1=0;}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0){system_Turn_right();//惯导偏正(向右)}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0){//imu2(10); //惯导偏正(向右)system_Turn_right();}break;} }
第二题视频:
2024电赛自动行驶小车(H题)_第二问
第三题:
第二题会做,这题其实也没问题...
//任务 3 void TASK_3(void) {if(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_14)==0) {beep(1);led(1); delay_ms(10); beep(0);led(0); status3 =1;status2=9;status1=9;}switch(status3){case 0:system_idie_state(); break;case 1://A->C 惯导后直线行驶target_angle=-33;//target_angle_F=0;while(imu2(-33)==0)status3=2;break;case 2://imu2(-37);//targetValue=-10;target_angle=-33;SPEEED[0]=55*(-1);SPEEED[1]=55;SPEEED[2]=55;SPEEED[3]=55*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动//任意检测到线if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1){beep(1);led(1);delay_ms(15);beep(0);led(0);target_angle=0;status3=3;status=1;status2=99;status1=99;} break;case 3://C-> B// //先清零系统预设方向status_Direction=0;//八路寻迹判断系统状态,一般会传给status_Direction数值FTT_judge_status();target_angle_F=0;//选择状态进入switch(status){case 0:system_idie_state(); break; //系统空闲状态:case 1:system_follow_straight();break; //系统直线寻迹状态(可带小弧度偏转) case 2:system_Turn_left(); break; //小车左转调整状态case 3:system_Turn_right(); break; //小车右转调整状态//case 4:system_stop(); break; //停车} //已经到B了if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])>=156)){beep(1);led(1);delay_ms(15);beep(0);led(0);//while(imu2(-148)==0) //偏正status=0; status3=4;status2=99;status1=99;}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0){system_Turn_right(); //惯导偏正(向右)}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0){//imu2(10); //惯导偏正(向右)system_Turn_left();} break;case 4://调整好角度target_angle_F=0;while(imu2_my(-163)==0)//target_angle=-63;//while(imu2(-63)==0)status3=5; status2=99; status1=99;break;case 5:// B->D target_angle_F=0;imu2_my(-138);system_Turn_left();SPEEED[0]=55*(-1);SPEEED[1]=55;SPEEED[2]=55;SPEEED[3]=55*(-1);I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动//任意检测到线if(L1==1 || L2==1 || L3==1|| L4==1|| L5==1|| L6==1|| L7==1|| L8==1){beep(1);led(1);delay_ms(15);beep(0);led(0);status3=6;status=1;} case 6 ://D->A // //先清零系统预设方向status_Direction=0;target_angle_F=0;//八路寻迹判断系统状态,一般会传给status_Direction数值FTT_judge_status();//选择状态进入switch(status){case 0:system_idie_state(); break; //系统空闲状态:case 1:system_follow_straight();break; //系统直线寻迹状态(可带小弧度偏转) case 2:system_Turn_left(); break; //小车左转调整状态case 3:system_Turn_right(); break; //小车右转调整状态//case 4:system_stop(); break; //停车} //已经到A了if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 &&(fabs(Angle_R[2])<=22)){SPEEED[0]=0;SPEEED[1]=0;SPEEED[2]=0;SPEEED[3]=0;I2C_Write_Len(MOTOR_FIXED_SPEED_ADDR,SPEEED,4); //控制电机转动beep(1);led(1);delay_ms(15);beep(0);led(0);//target_angle_F=0;target_angle_F=1;target_angle=0;while(imu2(0)==0) //偏正status=0; status3=7;status2=9;status1=0;}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]>0){system_Turn_right();//惯导偏正(向右)}//有可能是巡线时遇到调整角度黑线在夹缝 else if(L1==0&&L2==0&&L3==0&&L4==0&&L5==0&&L6==0&&L7==0&&L8==0 && Angle_R[2]<0){//imu2(10); //惯导偏正(向右)system_Turn_right();}break; } }
第三题视频:
这里就直接放第四问的视频了...第四问就是将第三问重复执行4次......
2024电赛自动行驶小车(H题)_第四问
主函数与状态安排:
主函数中有些任务状态变量statusx的初始值并不是0,这是为了防止进入其余状态时执行它的状态0操作(小车惯导0度 )的行为,并且,进入其余状态时,也应合理安排这些状态变量,使其不要互相串搞.....
网上查阅资料贴出:
PID超详细教程——PID原理+串级PID+C代码+在线仿真调参-CSDN博客
相关文章:

MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟
这次电赛题目选的简单了,还规定不能使用到摄像头,这让我之前学习的Opencv 4与树莓派无用武之地了,但我当时对于三子棋题目饶有兴趣,但架不住队友想稳奖,只能选择这个H题了...... 之后我还想抽空将这个E题三子棋题目做…...

C语言:指针(2)
一.数组名 在了解数组名前我们先看一段代码 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 根据我们上一篇学习的知识,我们知道&arr[0]是数组第一个元素的地址,这时我们再看另一段代码的运行结果。 #include <stdio.h> int ma…...
数组——二维数组
数组(中) 二维数组 定义 二维数组本质上是一个行列式的组合,也就是说二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。 二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。 …...
深入 Vue 组件与状态管理的教程
目录 深入 Vue 组件与状态管理的教程第一部分:深入组件1. 理解插槽(Slots)的使用1.1 基础插槽示例1.2 具名插槽1.3 作用域插槽 第二部分:Vue Router1. 学习 Vue Router 的基本配置1.1 基本路由配置1.2 嵌套路由1.3 路由参数 2. 导…...
Spring Boot 实现异步处理多个并行任务
在现代Web应用开发中,异步处理和多任务并行处理对于提高系统的响应性和吞吐量至关重要。Spring Boot 提供了多种机制来实现异步任务处理,本文将介绍如何利用这些机制来优化您的应用程序性能。 1. 引言 在高负载情况下,如果所有的请求都采用…...
TiDB系列之:使用Flink TiDB CDC Connector采集数据
TiDB系列之:使用Flink TiDB CDC Connector采集数据 一、依赖项二、Maven依赖三、SQL Client JAR四、如何创建 TiDB CDC 表五、连接器选项六、可用元数据七、特征一次性处理启动阅读位置多线程读取DataStream Source 八、数据类型映射 TiDB CDC 连接器允许从 TiDB 数…...
每日一道算法题 最接近的三数之和
题目 16. 最接近的三数之和 - 力扣(LeetCode) Python class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()nlen(nums)ans0min_diffinf # infinite 无穷for i in range(n-2):tmpnums[i]li1rn-1while l<…...
搭建自己的金融数据源和量化分析平台(六):下载并存储沪深两市上市公司财报
基于不依赖wind、某花顺等第三方平台数据的考虑,尝试直接从财报中解析三大报表进而计算ROE等财务指标,因此需要下载沪深两市的上市公司财报数据,便于后续从pdf中解析三大报表。 深市爬虫好做,先放深市爬虫: 根据时间段…...
C语言-常见关键字详解
一、const 关键字const用于声明常量,赋值后,其值不能再被修改。 示例: const int MAX_COUNT 100; 二、static static关键字在不同情境下有不同作用: 1.函数中的静态变量:保留变量状态,仅初始化一次&a…...
异步编程之std::future(一): 使用
目录 1.概述 2.std::future的基本用法 3.使用 std::shared_future 4.std::future的使用场景 5.总结 1.概述 在编程实践中,我们常常需要使用异步调用。通过异步调用,我们可以将一些耗时、阻塞的任务交给其他线程来执行,从而保证当前线程的…...

Vue3 + JS项目配置ESLint Pretter
前言 如果在开发大型项目 同时为多人协作开发 那么 ESLint 在项目中极为重要 在使用 ESLint 的同时 也需要使用 Pretter插件 统一对代码进行格式化 二者相辅相成 缺一不可 1. 安装 VsCode 插件 在 VsCode 插件市场搜索安装 ESLint 和 Pretter 2. 安装依赖 这里直接在 pac…...

JavaScript (十四)——JavaScript typeof和类型转换
目录 JavaScript typeof, null, 和 undefined typeof 操作符 null undefined undefined 和 null 的区别 JavaScript 类型转换 JavaScript 数据类型 JavaScript 类型转换 将数字转换为字符串 将布尔值转换为字符串 将日期转换为字符串 将字符串转换为数字 一元运算符…...

CTF-web 基础
网络协议 OSI七层参考模型:一个标准的参考模型 物理层 网线,网线接口等。 数据链路层 可以处理物理层传入的信息。 网络层 比如IP地址 传输层 控制传输的内容的传输,在传输的过程中将要传输的信息分块传输完成之后再进行合并。 应用…...
CP AUTOSAR标准之ChineseV2XNetwork(AUTOSAR_SWS_ChineseV2XNetwork)(更新中……)
1 简介和功能概述 本文档指定了AUTOSAR基础软件模块中国车辆对接网络(CnV2xNet)的功能、API和配置。 中国车联网网络(CnV2xNet)与中国车联网消息(CnV2xMsg)、中国车联网管理(CnV2xMgt)、中国车联网安全(CnV2xSec)以及AUTOSAR BSW模块以太网接口(EthIf)共同构成了AUTOSAR架构…...

【hloc】 项目流程
hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤,从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件,用户可以方便地运行整个流程。 1. 数…...

鸿蒙系统开发【应用接续】基本功能
应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器,主要包括一个直播视频播放界面,实现视频播放时可以从一台设备迁移到另一台设备继续运行,来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…...
nextTick方法的作用是什么?什么时候会用到
nextTick 方法在 Vue.js 中扮演着重要的角色,它用于在下次 DOM 更新循环结束之后执行延迟回调。这主要用于确保在 Vue 完成 DOM 更新后执行依赖于 DOM 的操作。 作用 确保 DOM 更新完成:Vue 的 DOM 更新是异步的,当你修改了数据后࿰…...

多 NodeJS 环境管理
前言 对于某个项目依赖特定版本的 NodeJS,或几个项目的 NodeJS 版本冲突时,需要在系统中安装多个版本的 NodeJS,这时可以使用一些工具来进行多个 NodeJS 的管理。 有很多类似的 NodeJS 管理工具,如 nvm, nvs, n 等,接…...
解决网站被植入跳转木马病毒
概述 网站被植入跳转木马病毒是一种常见的安全威胁,它可能导致网站用户被重定向到恶意站点。本文将指导您如何检测、清除这类木马病毒以及采取预防措施。 步骤1:确认感染 首先,需要确认您的网站确实受到了跳转木马的影响。 示例ÿ…...

Node.js(6)——npm软件包管理
npm npm是Node.js标准的软件包管理器。 使用: 初始化清单文件:npm init-y(得到package.json文件,有则略过此命令)下载软件包:npm i 软件包名称使用软件包 示例: 初始状态下npm文件夹下只有server.js,下载软件包前看…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...