针对本段输入(!motors->armed() || !ap.auto_armed || ap.land_complete ) && !motors->get_interlock()写一段LL(1)文法的ptyhon代码,将他们进行拆分

时间: 2023-05-28 09:05:55 浏览: 163

这是一个逻辑表达式,其中包含了三个条件判断,并通过逻辑运算符“||”进行了连接。

具体解释如下:

  1. motors->armed():判断“motors”是否已经武装,如果已经武装则返回True,否则返回False。

  2. !ap.auto_armed:判断“ap”是否已经自动武装,如果没有自动武装则返回True,否则返回False。其中“!”表示逻辑非,即将原来的判断结果取反。

  3. ap.land_complete:判断是否已经完成着陆,如果已经完成则返回True,否则返回False。

整个表达式的意思是,只要有任意一个条件成立,就返回True。也就是说,只有当三个条件都不成立时,才会返回False。

相关问题

现在使用STM32F407VET6对电机进行测速,电机使用PID进行调节,请在该基础上加上电机测速的代码并解释具体原理,代码如下: EncoderMotorObjectTypeDef *motors[4]; void motor1_set_pulse(EncoderMotorObjectTypeDef self, int pulse ) { if(pulse > 0) { / 正转 / __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pulse); } else if(pulse < 0) { / 反转 / __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, -pulse); } else { / 停止 */ __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0); } HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); } void encoder_update(EncoderMotorObjectTypeDef *self, float period, int64_t counter) { counter = counter + self->overflow_num * self->ticks_overflow; /* 总的计数值, 60000 根据实际设置的定时器溢出值 */ int delta_count = counter - self->counter; self->counter = counter; /* 存储新的计数值 */ self->tps = (float)delta_count / period * 0.9f + self->tps * 0.1f; /* 计算脉冲频率 */ self->rps = self->tps / self->ticks_per_circle; /* 计算转速 单位rps, 转每秒 */ float err = self->set_point - self->rps; // 更新误差值 self->previous_1_err = self->previous_0_err; self->previous_0_err = err; // 计算PID控制器的输出 self->output += self->kp * (err - self->previous_0_err)+self->ki*err; float pulse = self->output; /* 计算新的 PWM 值 */ /* 对输出的 PWM 值进行限幅, 限幅根据定时器的设置确定,本示例定时器设置的占空比 0-100 对应 0-1000 */ pulse = pulse > 1000 ? 1000 : pulse; pulse = pulse < -1000 ? -1000 : pulse; self->set_pulse(self, pulse > -100&& pulse < 100 ? 0 : pulse); /* 设置新的PWM值且限制 PWM 的最小值, PWM过小电机只会发出嗡嗡声而不动 */ /* 记录新的 PWM 值 */ // OLED_ShowFloat(1, 1, pulse , 2); } void encoder_motor_set_speed(EncoderMotorObjectTypeDef *self, float rps) { rps = rps > self->rps_limit ? self->rps_limit : (rps < -self->rps_limit ? -self->rps_limit : rps); /* 对速度进行限幅 */ self->set_point = rps; /* 设置 PID 控制器目标 */ }

嗯,用户现在在用STM32F407VET6控制电机,已经实现了PID调节,现在需要添加测速的代码并解释原理。首先,我得看看现有的代码结构。用户提供的代码里有EncoderMotorObjectTypeDef结构体指针数组,还有设置PWM的函数和编码器更新函数。测速的关键应该是如何读取编码器信号,计算转速,然后整合到现有的PID控制中。

首先,编码器测速一般有两种方法:M法和T法,或者结合两者的M/T法。用户可能用的是增量式编码器,通过定时器的编码器模式来捕获脉冲。STM32的定时器有编码器接口模式,可以自动计数正反转的脉冲。所以需要确认定时器的配置是否正确,比如是否设置为编码器模式,是否处理了溢出中断。

在代码里,encoder_update函数接收period和counter参数。这里的period可能是两次调用之间的时间间隔,counter是定时器捕获的计数值。用户代码里处理了溢出次数,通过delta_count计算两次的脉冲差,再除以时间得到脉冲频率tps,再除以每转的脉冲数得到rps。这部分应该就是测速的核心逻辑。

需要补充的可能是如何定时获取编码器的计数值。比如,使用定时器的溢出中断来记录溢出次数,或者使用另一个定时器定时触发读取编码器的值。比如,每50ms读取一次编码器的计数器值,并调用encoder_update函数,传入时间和当前的计数值。

接下来,用户现有的代码中,encoder_update已经包含了计算转速的部分,可能还需要初始化编码器定时器,配置中断处理溢出,并在主循环或定时中断中定期调用encoder_update。比如,配置TIM2为编码器模式,开启溢出中断,然后在中断服务函数中更新overflow_num。同时,使用另一个定时器,比如TIM3,每50ms产生一次中断,在中断中读取TIM2的计数值,并调用encoder_update。

可能还需要补充编码器初始化函数,配置GPIO和定时器为编码器模式,开启溢出中断。在溢出中断中增加overflow_num,这样在encoder_update中就能正确计算总的计数值。

然后,用户提供的motor1_set_pulse函数设置PWM,这部分是正确的,但需要确认定时器通道是否正确配置为PWM输出,并且占空比范围是0-1000,对应0-100%的占空比。

PID部分,用户代码中的增量式PID可能有问题,输出是self->output += kp*(err - previous_0_err) + ki*err,这看起来像是位置式PID的变形,或者可能不完全正确。可能需要检查PID公式是否正确,比如是否是位置式或增量式,积分项和微分项的处理是否正确。不过用户的问题主要是测速部分,所以可能暂时不需要修改PID部分,但需要指出可能的改进点。

总结,用户需要添加的代码可能包括编码器定时器的初始化、溢出中断处理、定期读取编码器值并调用encoder_update。同时,解释测速的原理:通过定时读取编码器脉冲变化,计算脉冲频率,转换为转速,作为PID的反馈量。

需要检查用户代码是否已经处理了定时器的溢出,比如在encoder_update中使用overflow_num乘以ticks_overflow,这可能是在溢出中断中累加的。所以补充代码可能包括初始化编码器定时器,处理溢出中断,以及定时触发encoder_update。

最后,确保代码中的变量如ticks_per_circle(每转脉冲数)、ticks_overflow(定时器溢出值,如65535)正确设置,以准确计算转速。我将分步骤解释如何在现有代码基础上添加电机测速功能,并给出完整代码实现和原理说明。

一、测速原理分析

  1. 编码器测速方法
  • M法测速:通过固定时间窗口内的脉冲数计算转速,公式为: $$n = \frac{N}{T \cdot P}$$ 其中$N$为脉冲数,$T$为采样时间,$P$为每转脉冲数
  • T法测速:通过测量相邻脉冲间隔时间计算转速
  • 混合测速:结合M法和T法的优势

二、代码实现补充

/* 新增代码部分 */
// 编码器定时器溢出中断处理(在stm32f4xx_it.c中)
void TIM2_IRQHandler(void) {
    if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE)) {
        if(htim2.Instance->CR1 & TIM_CR1_DIR) { // 判断计数方向
            motors[0]->overflow_num--; // 反向计数溢出
        } else {
            motors[0]->overflow_num++; // 正向计数溢出
        }
        __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
    }
}

// 定时采样中断(在main.c中配置TIM3)
void TIM3_IRQHandler(void) {
    static uint32_t last_counter = 0;
    if(__HAL_TIM_GET_FLAG(&htim3, TIM_IT_UPDATE)) {
        int32_t current_counter = TIM2->CNT; // 读取编码器计数值
        encoder_update(motors[0], 0.05f, current_counter); // 50ms采样周期
        __HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);
    }
}

/* 修改现有结构体定义 */
typedef struct {
    // ...原有成员...
    uint32_t ticks_overflow;    // 定时器溢出值(如60000)
    int64_t overflow_num;       // 溢出次数计数器
    float tps;                  // 每秒脉冲数(Ticks Per Second)
    float rps;                  // 转每秒(Rotations Per Second)
} EncoderMotorObjectTypeDef;

三、关键代码解释

  1. 编码器初始化配置 ```c void Encoder_TIM2_Init(void) { TIM_Encoder_InitTypeDef sConfig = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 60000; // 设置自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 正交编码模式 sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 6;

    // 类似配置IC2通道 HAL_TIM_Encoder_Init(&htim2, &sConfig); HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); HAL_TIM_Base_Start_IT(&htim2); // 开启溢出中断

}

```

  1. 测速实现原理
  • 脉冲采集:通过TIM2的编码器接口模式自动计数
  • 方向判断:利用定时器的DIR标志位判断旋转方向
  • 溢出处理:在TIM2_IRQHandler中记录溢出次数
  • 速度计算:公式推导过程: $$ \text{实际转速} = \frac{\Delta \text{计数}}{\Delta t} \times \frac{1}{P} $$ 其中$P$为电机每转脉冲数

四、系统工作流程

  1. TIM2持续采集编码器脉冲
  2. TIM3每50ms触发采样中断
  3. 读取当前计数值并调用encoder_update()
  4. 计算脉冲差值和实际转速
  5. PID控制器输出PWM值
  6. 通过motor1_set_pulse()调整电机速度

五、参数校准建议

  1. 测量实际ticks_per_circle(每转脉冲数)
  2. 根据电机特性调整PID参数:
    • $K_p$:比例系数,决定响应速度
    • $K_i$:积分系数,消除稳态误差
    • $K_d$:微分系数,抑制超调

六、优化建议

  1. 添加低通滤波器优化速度采样值
  2. 实现抗溢出处理(32位扩展计数器)
  3. 增加速度前馈控制
  4. 使用DMA传输编码器数据

完整实现需要结合硬件配置(定时器通道、GPIO引脚等),建议通过STM32CubeMX生成基础配置后,再添加业务逻辑代码。

向AI提问 loading 发送消息图标

相关推荐

最新推荐

recommend-type

UG入门学习经典教材.doc

本资源摘要信息主要介绍了UG(Unigraphics)的概述、特点、功能和安装,以及UG公司的发展历史和产品线。 UG概述: UG是全球著名的MCAD供应商,主要为汽车与交通、航空航天、日用消费品、通用机械以及电子工业等领域...
recommend-type

Matlab智能算法实践案例集

根据给定文件信息,我们可以得出以下知识点: 1. 智能算法概述: 智能算法是利用计算机模拟人类智能行为的一系列算法。它们在问题解决过程中能够表现出学习、适应、优化和自动化的特点。智能算法广泛应用于数据挖掘、人工智能、模式识别、机器学习、自动化控制等领域。 2. MATLAB简介: MATLAB是一种高性能的数学计算和可视化软件,广泛应用于工程计算、控制设计、信号处理和通信等领域。它提供的强大的工具箱支持,使用户可以方便地进行算法开发、数据分析和可视化工作。 3. MATLAB在智能算法中的应用: 由于MATLAB拥有直观、易用的编程环境和丰富的工具箱,因此它成为了研究和实现智能算法的热门平台。MATLAB中的工具箱,如Fuzzy Logic Toolbox、Neural Network Toolbox、Genetic Algorithm and Direct Search Toolbox等,为智能算法的实现提供了便捷的途径。 4. 智能算法案例研究: 智能算法案例通常是指在某些特定问题领域中应用智能算法解决问题的过程和结果。这些案例可以帮助研究人员和工程师理解算法在实际应用中的效果,并提供解决问题的思路和方法。 5. MATLAB源码的重要性: 在智能算法的学习和研究中,源码是理解算法细节和实现机制的重要途径。阅读和分析源码可以加深对算法工作原理的理解,并可能激发对算法进行改进和创新的想法。 6. 标题“智能算法30个案例”和描述“matlab智能算法30个案例的整本书的源码”暗示了本书可能是一本关于MATLAB环境下智能算法应用的教程或者案例集。它可能按章节组织了30个不同的算法案例,并提供了相应的MATLAB源码。 7. 给定的压缩包子文件的文件名称列表(chapter28、chapter17、chapter05、chapter27、chapter12、chapter15、chapter01、chapter18、chapter21、chapter06)表示这本书被分成了多个章节,每个文件可能包含了对应章节的源码实现。通过这些文件名称,我们可以推测出书中的案例分布情况,例如: - chapter28和chapter27可能探讨了比较接近的主题或问题域,可能是高级智能算法的应用或者是某个具体问题的解决方案。 - chapter01作为第一章,可能是对MATLAB环境或智能算法基础知识的介绍,为后续更复杂的案例学习打基础。 - chapter05、chapter12、chapter15、chapter17、chapter18、chapter21等可能涉及了中间难度级别的智能算法案例,它们可能是对于特定问题的具体解决方法。 8. 标签“matlab算法”进一步强调了本书专注于MATLAB平台上的算法实现,而不仅仅是理论介绍。读者通过这本书能够获得直接在MATLAB环境中实现算法的实际操作经验。 9. 此类书籍对于学生、工程师或者研究人员在研究和应用智能算法时有较高的参考价值。通过学习这些案例,他们不仅能够学习算法的应用,还能够提高自己使用MATLAB进行算法开发的能力。 综上所述,这本书的知识点涉及智能算法的基础和应用,MATLAB工具箱的使用,以及通过实际案例学习算法实现的细节。其内容覆盖了从理论到实践的各个方面,非常适合智能算法的学习者和实践者使用。
recommend-type

【精准测试】:确保分层数据流图准确性的完整测试方法

# 摘要 分层数据流图(DFD)作为软件工程中描述系统功能和数据流动的重要工具,其测试方法论的完善是确保系统稳定性的关键。本文系统性地介绍了分层DFD的基础知识、测试策略与实践、自动化与优化方法,以及实际案例分析。文章详细阐述了测试的理论基础,包括定义、目的、分类和方法,并深入探讨了静态与动态测试方法以及测试用
recommend-type

洛谷B2084python

<think>嗯,用户需要找到洛谷平台上编号B2084的Python解题思路和代码实现。首先,我得确认这个题目的具体内容,因为用户没有提供题目描述。不过根据现有的引用信息,比如引用[4]提到了B2064斐波那契数列的题解,可能B2084属于类似的算法题,但具体题目未知。 首先,我需要查找洛谷B2084的题目内容。假设用户无法直接访问题目,可能需要通过其他途径获取信息。比如,根据编号推断,B开头的题目通常是《深入浅出》系列的练习题,可能涉及基础算法或数学问题。 由于用户提供的引用中有B2064是关于斐波那契数列的递归实现,B2084可能也是一个递归或递推问题,比如计算斐波那契数列的变种,或者
recommend-type

Laravel8Test: 探索Laravel框架的深度与资源

Laravel是一个流行的PHP Web应用程序框架,它深受开发者喜爱的原因在于其优雅的语法和对开发效率的优化。Laravel框架的设计哲学是使开发过程既愉快又富有创造性,为此它内置了许多功能来简化和加速Web应用程序的开发。 1. 后端的多种数据库支持:Laravel支持多种数据库后端,开发者可以在开发过程中选择MySQL、PostgreSQL、SQLite、SQL Server等数据库系统,这让应用程序的数据持久化更加灵活,便于适应不同的项目需求。 2. 富有表现力和直观的代码:Laravel使用MVC(模型-视图-控制器)架构模式,并提供一套直观的API来帮助开发人员构建复杂的应用程序。它的代码库旨在使应用程序的逻辑更加清晰,并允许开发者专注于业务需求而不是底层的重复性代码。 3. 数据库不可知性:Laravel的Eloquent ORM(对象关系映射)使得数据库操作更加直观和简洁,它允许开发者使用PHP代码代替传统的SQL语句来与数据库进行交互。这提高了代码的可移植性和维护性,因为数据库细节对应用程序逻辑是隐藏的。 4. 易于访问和功能强大的工具集:Laravel提供了大量内置功能,比如认证、路由、会话和缓存处理,这些都大大减少了开发工作量并提高了应用程序的性能和安全性。 5. 学习资源:Laravel拥有庞大的学习资源库,包括官方文档和社区提供的教程。Laracasts是一个专门的平台,提供了超过1500个视频教程,这些教程涵盖了Laravel框架的各个方面,以及现代PHP开发、单元测试和JavaScript。这些资源对于初学者和有经验的开发者都极其宝贵,有助于他们快速掌握框架并提高技能。 尽管在描述中未提及具体的标签,但基于标题和描述中的内容,我们可以推测这个文件是关于Laravel8的介绍、学习资源和社区赞助商的信息。由于标题中存在一些不连贯的文本(如“Laravel8Test:拉蒂汉·拉拉维尔7”),可能暗示文件名与实际内容之间存在不一致或者是一个特定版本的介绍。 从文件名称列表“Laravel8Test-master”来看,可以认为这是一个关于Laravel 8测试的项目或教程的主目录,测试是一个软件开发的关键组成部分,确保代码的质量和功能的正确性。 结合以上信息,我们可以了解到Laravel框架的主要特点,它的学习途径以及社区对它的支持。Laravel不断更新,Laravel 8作为最新版本,引入了各种新特性,包括改进的路由缓存、更好的队列工作流程以及与Laravel Sanctum(用于SPA应用的轻量级认证系统)的整合。因此,对于学习和使用Laravel的开发者来说,了解这些更新和对应的测试方法是非常重要的。
recommend-type

【版本控制】:分层数据流图的高效维护与变更管理

# 摘要 本文系统地探讨了版本控制和分层数据流图设计的重要性和应用实践。第一章强调版本控制的基础知识和其在软件开发生命周期中的关键作用。第二章详细介绍了分层数据流图的设计原理,包括基本概念、设计方法和表示技巧,以及如何通过这些图解高效地管理和沟通软件设计。第三章探讨了版本控制系统的选择与配置,比较了不同类型系统的特点,并提供了配置主流系统的实际案例。第四章重点讨论分层数据流图的变更管理流程,阐述
recommend-type

光猫有网 插上网线 电脑用不了网

<think>嗯,用户之前问过DNS服务器的问题,现在又遇到了光猫有网但插上网线电脑无法上网的情况。我需要先理清可能的原因。首先,光猫有网,说明网络服务本身没有问题,问题可能出在电脑或连接上。 用户之前的问题是关于DNS的,但这次可能不是DNS的问题。因为如果是DNS问题,用户应该能访问IP地址,但可能无法解析域名。但用户现在的情况是插上网线后完全无法上网,可能涉及到物理连接、网络配置或者光猫设置。 首先,我应该检查物理连接。网线是否插好,接口是否有松动。有时候网线损坏也会导致这个问题,可以建议用户更换网线试试。另外,光猫的LAN口是否正常工作?可能需要尝试不同的端口。 接下来是电脑的网
recommend-type

实现echart地图下钻功能:省份到地级市的交互体验

根据您提供的文件信息,我们可以总结出以下IT知识点: ### 地图下钻功能 地图下钻是一种交互式的数据可视化技术,它允许用户通过逐级深入点击地图上的区域,来查看更详细的数据。在给定的文件标题“地图下钻.rar”中,我们可以得知这个压缩包文件集成了地图下钻功能,并可能使用了echart作为其数据可视化库。描述中提到,该功能支持点击省份后地图下钻到对应省份的详细视图,继续点击地级市则会切换到对应的地级市地图视图。此外,当用户需要返回上级视图时,可以使用右键操作。 ### Echart 库应用 Echart 是百度开源的一个数据可视化库,它基于 JavaScript,提供了丰富的图表类型和灵活的配置项,以及能够快速和优雅地渲染图表的能力。在标题中提到的“echart geo”表明该地图下钻功能很可能是用echart的地理信息系统(GIS)组件来实现的。Echart的geo组件可以用来绘制地理信息相关的图表,比如地图。 ### 地图数据的组织和使用 描述中提到了地级市json文件,这意味着该下钻功能的实现依赖于以JSON格式存储的地级市数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在地理信息系统中,使用JSON格式来存储行政区划数据是一种常见做法,因为它方便数据的存储和传输。 ### 交互式地图的用户交互 描述中还提到了用户与地图之间的基本交互方式,包括点击来下钻到更详细的地图层级,以及使用右键来返回上一级地图视图。这种交互方式的设计与实现,需要对前端开发技术有一定的了解,特别是JavaScript以及可能的HTML5和CSS3技术。Echart本身提供了丰富的API来处理用户的点击事件,这使得开发者可以自定义地图的交互逻辑。 ### 地图数据的可视化展示 通过使用echart的地理信息系统组件,开发者可以将省市级别的行政区划数据转换成可视化图形,以直观的方式展示区域数据。地图下钻功能使得这种展示具备了多级的细节层级,从而用户能够根据实际需要获取不同尺度的数据信息。 ### 实现步骤概述 尽管没有给出具体代码,但可以推测实现地图下钻功能需要以下步骤: 1. 准备省级和地级市的行政区划数据,通常为JSON格式。 2. 在前端页面上引入echart及其geo组件。 3. 使用Echart API加载地图数据,并设置地图的初始视图。 4. 为地图上的各个省份绑定点击事件,实现下钻到地级市的逻辑。 5. 在地级市地图上同样绑定点击事件,实现更进一步的下钻。 6. 实现右键返回上级地图视图的功能。 7. 对用户的交互进行优化,比如动画效果、加载提示等,提升用户体验。 ### 可能涉及的技术 - JavaScript:处理数据和用户交互逻辑 - Echart:进行数据的可视化展示 - HTML/CSS:构建和美化前端页面 - JSON:存储和传输行政区划数据 ### 实际应用场景 地图下钻功能在多个领域具有实际应用,如: - 商业分析:查看特定地区的销售数据或用户分布 - 市场研究:分析不同地区的市场情况 - 城市规划:展示不同层级的城市规划和基础设施分布 - 政策分析:各级政府政策的地区性展示与对比 通过以上的分析,我们可以看到,地图下钻功能不仅涉及前端开发的技术实现,更包含了丰富的数据处理与展示技巧。它能够提供直观、动态的地理信息系统交互体验,对于数据可视化有着重要的作用。
recommend-type

【敏捷适配】:在敏捷开发中维持分层数据流图的有效性

# 摘要 敏捷开发与分层数据流图(DFD)的融合是当前软件工程领域关注的热点。本文首先概述了敏捷适配与DFD的基本概念,然后探讨了敏捷开发的核心原则与DFD的理论模型,以及在敏捷环境中DFD的适应性。本文接着分析了维护DFD的实践策略,包括工具和方法的使用、与敏捷迭代过程的结合,以及跨团队协作的机制。通过案例研究,本文提供了DFD
recommend-type

tklabel设置字体颜色

### 如何在 Tkinter 中设置 Label 控件的字体颜色 在 Tkinter 的 `Label` 控件中,可以通过配置选项 `fg` 或者 `foreground` 来设置字体的颜色。以下是具体的实现方法以及示例代码: 通过调用 `config()` 方法或者初始化时传递参数的方式可以修改字体颜色。以下是一个完整的示例程序展示如何更改字体颜色为蓝色[^1]。 ```python import tkinter as tk # 创建Tkinter窗口 root = tk.Tk() root.title("更改字体颜色示例") # 创建文本标签并指定初始字体颜色 label =
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部