6.存储过程中的游标使用(6/10)

news2024/11/26 10:05:10

存储过程中的游标使用

引言

在数据库编程中,游标(Cursor)是一种重要的数据库对象,它允许开发者逐行处理查询结果集。这对于需要对每一行数据进行特定处理的场景非常有用,如数据转换、数据清洗、复杂计算等。本文将详细介绍游标的概念、使用方法以及在存储过程中的应用。

1. 游标的基本概念

游标是数据库查询结果集的指针,它指向结果集中的某一行,通过游标可以逐行遍历查询结果集,并对每一行数据进行处理。游标(Cursor)是数据库中的一个重要概念,它用于逐行处理查询结果集。以下是游标的一些基本概念:

定义

游标可以被视为结果集的指针,它允许用户逐行(或一小部分)地访问和操作大型结果集。

作用

  1. 逐行访问:游标使得开发者能够逐行读取结果集,从而可以对每一行进行单独的处理。
  2. 数据操作:通过游标,可以在遍历结果集的过程中修改或删除特定的行。
  3. 性能控制:游标允许开发者更细致地控制数据检索和处理过程,有时可以提高性能。

使用场景

  1. 处理大量数据:当需要处理大量数据时,使用游标逐行处理可以减少内存消耗。
  2. 复杂操作:在需要对查询结果进行复杂逻辑处理的场景中,游标提供了一种灵活的处理方式。

游标的操作步骤

  1. 声明游标:声明游标并指定其选择的查询语句。
  2. 打开游标:打开游标以准备访问结果集。
  3. 提取数据:使用游标逐行提取数据。
  4. 关闭游标:完成数据处理后关闭游标,释放资源。

示例(MySQL)

sql

DELIMITER //

CREATE PROCEDURE example_procedure()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_id INT;
    DECLARE v_name VARCHAR(100);
    DECLARE cur CURSOR FOR SELECT id, name FROM users;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO v_id, v_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 处理获取的数据
        -- 例如:更新数据
        UPDATE users SET name = CONCAT('Modified ', v_name) WHERE id = v_id;
    END LOOP;

    CLOSE cur;
END //

DELIMITER ;

在这个例子中,我们声明了一个游标cur,用于遍历users表中的所有行。我们打开游标,然后通过循环逐行提取数据,直到结果集的末尾。

注意事项

  1. 资源消耗:游标可能会消耗较多资源,因为它们需要为结果集的每一行分配内存。
  2. 性能考虑:在可能的情况下,考虑使用集合操作来代替游标,以提高性能。
  3. 事务控制:在使用游标进行数据修改时,需要注意事务的控制,以确保数据的一致性和完整性。

游标是数据库编程中处理结果集的强大工具,但需要谨慎使用,以避免潜在的性能问题。

2. 游标的声明和使用

在MySQL中,游标的使用包括声明、打开、提取数据和关闭几个步骤。下面是每个步骤的详细说明和示例:

2.1 声明游标

声明游标需要指定游标的名称和一个SELECT查询语句,该语句定义了游标将要遍历的结果集。

语法sql

DECLARE cursor_name CURSOR FOR select_statement;

示例sql

DECLARE employee_cursor CURSOR FOR SELECT * FROM employees;

在这个例子中,employee_cursor 是游标的名称,它被声明为遍历 employees 表的所有行。

2.2 打开游标

声明游标后,使用OPEN语句打开游标,以便开始访问结果集中的数据。

语法sql

OPEN cursor_name;

示例sql

OPEN employee_cursor;

这个语句打开了一个名为 employee_cursor 的游标,使其准备好可以开始提取数据。

2.3 提取数据

使用FETCH语句从打开的游标中提取数据。可以使用 FETCH NEXTFETCH PRIORFETCH FIRSTFETCH LAST 等关键字来获取不同位置的数据。

语法sql

FETCH cursor_name INTO variable_list;

示例sql

FETCH employee_cursor INTO @employee_id, @employee_name, @employee_salary;

这个语句从 employee_cursor 游标中提取下一行数据,并将结果集中的列值分别赋给变量 @employee_id@employee_name@employee_salary

2.4 关闭游标

完成数据提取后,使用CLOSE语句关闭游标,释放系统资源。

语法sql

CLOSE cursor_name;

示例sql

CLOSE employee_cursor;

这个语句关闭了名为 employee_cursor 的游标,释放了与游标相关的资源。

完整示例

下面是一个完整的存储过程中使用游标的示例:

sql

DELIMITER //

CREATE PROCEDURE ProcessEmployees()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE emp_id INT;
    DECLARE emp_name VARCHAR(100);
    DECLARE emp_salary DECIMAL(10, 2);
    DECLARE emp_cursor CURSOR FOR SELECT id, name, salary FROM employees;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN emp_cursor;

    read_loop: LOOP
        FETCH emp_cursor INTO emp_id, emp_name, emp_salary;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 可以在这里处理每一行数据,例如打印或者更新
        SELECT emp_id, emp_name, emp_salary;
    END LOOP;

    CLOSE emp_cursor;
END //

DELIMITER ;

在这个存储过程中,我们声明了一个游标来遍历 employees 表,然后打开游标,通过循环逐行提取数据,直到结果集的末尾,最后关闭游标。

3. 游标在数据处理中的应用

游标在处理大量数据或需要逐行操作的场景中特别有用。例如,在数据清洗、报表生成、数据分析和大数据集处理等场景中,游标允许按需加载和处理数据,而不会占用大量内存。

游标在数据处理中的应用非常广泛,尤其是在需要逐行处理数据的场景中。以下是游标在数据处理中的一些典型应用:

1. 数据清洗

在数据清洗过程中,可能需要检查和修改每一条数据记录。游标允许逐行访问数据,这样可以对每条记录进行验证和清洗,例如,修正格式错误、去除重复记录或更新不准确的数据。

2. 报表生成

在生成复杂的报表时,可能需要从多个表中提取数据,并对数据进行汇总、排序和格式化。游标可以逐行处理数据,使得可以构建动态的、定制化的报表。

3. 数据分析

在数据分析中,游标可以用来逐行分析数据,以便进行更细致的数据挖掘和探索。例如,可以使用游标来实现复杂的数据模型,或者对数据进行多维度的分析。

4. 大数据集处理

对于大型数据集,一次性加载所有数据可能会导致内存不足。游标允许逐行读取数据,这样可以有效地处理大数据集,而不会占用大量内存。

5. 批量更新

在需要对数据集中的多行数据进行批量更新时,游标可以逐行访问并更新数据,同时允许在更新前后执行额外的逻辑,如计算新值或检查条件。

6. 复杂逻辑处理

在某些情况下,可能需要根据每行数据的特定条件执行不同的操作。游标提供了一种机制,可以在处理每行数据时应用复杂的业务逻辑。

示例应用场景

假设有一个员工信息表 employees,需要生成一个包含员工详细信息的报告,并且需要对某些字段进行特殊处理。以下是一个使用游标的存储过程示例:

sql

DELIMITER //

CREATE PROCEDURE GenerateEmployeeReport()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE emp_id INT;
    DECLARE emp_name VARCHAR(100);
    DECLARE emp_salary DECIMAL(10, 2);
    DECLARE emp_cursor CURSOR FOR SELECT id, name, salary FROM employees;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN emp_cursor;

    read_loop: LOOP
        FETCH emp_cursor INTO emp_id, emp_name, emp_salary;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        -- 特殊处理,例如格式化姓名或计算奖金
        SET emp_name = CONCAT('Mr/Ms ', emp_name);
        SET emp_salary = emp_salary * 1.1; -- 假设奖金是薪水的10%

        -- 生成报告
        INSERT INTO employee_report (id, formatted_name, salary_with_bonus) VALUES (emp_id, emp_name, emp_salary);
    END LOOP;

    CLOSE emp_cursor;
END //

DELIMITER ;

在这个存储过程中,游标用于逐行读取员工信息,并对每条记录进行处理,最后将处理后的数据插入到报告表中。

注意事项

  • 性能考虑:虽然游标提供了逐行处理数据的灵活性,但它们通常比批量操作更慢。在性能敏感的应用中,应权衡使用游标的必要性。
  • 资源管理:使用游标时,确保在不再需要时关闭游标,以释放系统资源。
  • 错误处理:在使用游标的过程中,应适当地处理可能出现的错误,确保数据的一致性和完整性。

4. 示例:使用游标进行数据清洗

在您提供的示例中,有几个小错误需要修正。在MySQL中,变量声明不应该使用@符号(除非是会话变量),而应该使用DECLARE关键字。另外,DEALLOCATE PREPARE语句用于释放预处理语句,而不是游标。最后,CONTINUE HANDLER用于设置当游标读取完毕时done变量的状态。

以下是一个修正后的示例,展示如何使用游标进行数据清洗:

sql

DELIMITER //

CREATE PROCEDURE CleanOrders()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_user_id INT;
    DECLARE v_order_total DECIMAL(10, 2);
    DECLARE cur CURSOR FOR SELECT user_id, order_total FROM orders;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO v_user_id, v_order_total;
        IF done THEN
            LEAVE read_loop;
        END IF;
        IF v_order_total < 10.00 THEN
            UPDATE orders SET is_valid = 0 WHERE user_id = v_user_id;
        END IF;
    END LOOP;

    CLOSE cur;
END //

DELIMITER ;

在这个存储过程中,我们执行以下步骤:

  1. 声明了一个名为done的变量,用于指示是否已经读取完游标指向的所有数据。
  2. 声明了两个变量v_user_idv_order_total,用于存储从游标中提取的数据。
  3. 声明了一个游标cur,用于从orders表中选择user_idorder_total列。
  4. 声明了一个处理程序,当游标读取完毕时,将done设置为TRUE
  5. 打开游标,开始遍历orders表。
  6. 使用一个循环结构,通过FETCH语句逐行提取数据。
  7. 如果提取的数据中order_total小于10.00,则更新相应记录的is_valid字段为0,标记为无效订单。
  8. 循环直到游标读取完毕。
  9. 关闭游标。

请注意,这个存储过程假设orders表中有一个名为is_valid的列,用于标记订单的有效性。在实际应用中,需要确保这个列存在并且数据表结构与代码中的字段匹配。

5. 结论

游标是MySQL存储过程中一个重要的概念,它允许逐行处理查询结果集。通过声明、打开、获取数据、处理数据、关闭和释放游标等步骤,可以在存储过程中灵活地操作和处理数据。

结论

确实,游标在MySQL存储过程中扮演着关键角色,尤其是在需要逐行处理数据时。它们提供了一种方法来精细控制数据操作,这在某些复杂的数据处理场景中是非常有用的。以下是游标使用的几点关键总结:

  1. 逐行处理能力:游标允许开发者对查询结果集进行逐行遍历,这对于执行行级逻辑和复杂计算是必要的。

  2. 灵活性:通过游标,可以在存储过程中实现更复杂的数据处理逻辑,包括条件判断、数据更新和删除等。

  3. 资源管理:使用游标时,需要注意及时关闭和释放游标,以避免占用过多数据库资源。

  4. 性能考虑:虽然游标提供了处理数据的灵活性,但其性能通常低于批量操作。因此,在处理大量数据时需要谨慎使用。

  5. 错误处理:在使用游标的过程中,应该实施适当的错误处理机制,确保在遇到错误时能够保持数据的一致性和完整性。

  6. 适用场景:游标适用于那些需要逐行读取和处理数据的场景,如数据清洗、复杂报表生成、逐行数据分析等。

  7. 代码可维护性:良好的游标使用实践可以提高存储过程的可读性和可维护性,但过度使用或不当使用也可能导致代码难以理解和维护。

附录

参考代码

sql

DELIMITER //

CREATE PROCEDURE ProcessOrders()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_user_id INT;
    DECLARE v_order_total DECIMAL(10, 2);
    DECLARE order_cursor CURSOR FOR SELECT user_id, order_total FROM orders;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN order_cursor;

    read_loop: LOOP
        FETCH order_cursor INTO v_user_id, v_order_total;
        IF done THEN
            LEAVE read_loop;
        END IF;
        IF v_order_total < 10.00 THEN
            UPDATE orders SET is_valid = 0 WHERE user_id = v_user_id;
        END IF;
    END LOOP;

    CLOSE order_cursor;
END //

DELIMITER ;
进一步阅读
  1. MySQL官方文档 - 提供了关于存储过程、游标和错误处理的详细信息。

    • MySQL Stored Procedures
    • MySQL Cursors
  2. Books:

    • "SQL Cookbook" by Anthony Molinaro
    • "Pro MySQL" by Patrick Galbraith, Rick Bramble
  3. Online Resources:

    • Tutorial Point - MySQL Cursors
    • w3schools - MySQL Cursors

通过这些资源,你可以更深入地了解游标的使用,以及如何在实际应用中有效地实现数据操作和处理。

6. 注意事项

1. 性能影响

游标操作可能会导致数据库性能下降,特别是在处理大量数据时。这是因为:

  • 逐行处理:游标逐行处理数据,这通常比批量操作要慢。
  • 资源消耗:游标需要额外的资源来维护结果集的状态,这可能会增加数据库的负担。
  • 事务锁定:游标可能会锁定数据行,导致其他操作等待。

优化建议

  • 尽可能使用批量操作来替代游标。
  • 如果必须使用游标,尽量减少游标操作的复杂性。
  • 考虑在低峰时段运行涉及游标的存储过程。

2. 完成处理程序(CONTINUE HANDLER)

在存储过程中使用游标时,声明一个完成处理程序是非常重要的。这个处理程序用于在结果集结束时设置一个标志变量,以便循环可以正确地终止。

示例

sql

DECLARE done INT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

这个处理程序在每次尝试获取下一行但结果集已经没有更多行时,将done变量设置为TRUE

3. 关闭游标

确保在存储过程结束前关闭游标,以释放占用的资源。未关闭的游标可能会继续占用数据库资源,导致性能问题。

示例

sql

CLOSE cursor_name;

其他注意事项

  • 错误处理:在使用游标的存储过程中,应该实现适当的错误处理逻辑,以便在发生错误时能够恢复或回滚事务。
  • 游标的声明:游标应该在存储过程的开始部分声明,并在需要时打开和关闭。
  • 变量的作用域:在使用游标时,要注意变量的作用域。确保在循环中使用的变量在声明游标之前已经声明。
  • 事务管理:在使用游标进行数据修改时,要注意事务的控制。确保在适当的时候提交或回滚事务。

通过遵循这些注意事项,可以有效地使用游标,同时减少对数据库性能的负面影响,并确保存储过程的健壮性和可靠性。

39e89f2d294249709c0f3eaf34d4c3da.png

通过本文的介绍和示例,希望您能更深入地了解MySQL游标的作用和使用方式。如果您有任何问题或想要深入了解更多,请在下面的评论中留言。如果您觉得这篇文章对您有帮助,请点赞并分享,以便更多人能够受益。


相关文章推荐

1.MySQL存储过程基础(1/10)

2.创建第一个MySQL存储过程(2/10)

3.使用条件语句编写存储过程(3/10)

4.循环结构在存储过程中的应用(4/10)

5.错误处理在存储过程中的重要性(5/10)

6.存储过程中的游标使用(6/10) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 与 GTK:跨平台 GUI 开发利器,可用Python助力高效GUI编程

在现代软件开发中&#xff0c;图形用户界面 (GUI) 至关重要&#xff0c;它直接影响用户体验和软件的易用性。Qt 和 GTK 作为两种主流的跨平台 GUI 库&#xff0c;为开发者提供了构建精美且功能强大的应用程序的强大工具。本文将深入介绍 Qt 和 GTK 的特性&#xff0c;并探讨如何…

SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑

概述 在 SwiftUI 中&#xff0c;我们可以借助渐变色&#xff08;Gradient&#xff09;来实现更加灵动多彩的着色效果。从 SwiftUI 6.0 开始&#xff0c;苹果增加了全新的网格渐变色让我们对其有了更自由的定制度。 因为 gif 格式图片自身的显示能力有限&#xff0c;所以上面的…

springboot网站开发-mysql数据库字段varchar类型存储汉字的长度关系

springboot网站开发-mysql数据库字段varchar类型存储汉字的长度关系&#xff01; 如果你的数据表是utf-8编码&#xff0c;并且采用的是mysql数据库。设计自己的业务数据。那么&#xff0c;如果你采用是varchar类型的字段格式&#xff0c;一个汉字就是一个字节。 如图所示&#…

zookeeper API使用——znode的CRUD

这应该是目录 一、创建连接1.1构造函数1.2创建连接(封装) 二、节点操作2.1创建节点create语法代码 2.2获取节点数据getData语法代码 2.3获取子节点getChildren语法代码 2.4修改节点的值setData语法代码 2.5删除delete语法代码 以下的代码只能作为基础的语法使用&#xff0c;为了…

带隙基准Bandgap电路学习(二)

一、高低温性能测试 设置仿真环境温度为-40℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.1853 输出噪声曲线&#xff1a; 电源抑制PSR曲线&#xff1a; 设置仿真环境温度为85℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.7297 输出噪…

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…

旅游景区小程序|提供多元化服务,打造一站式旅游体验

今年国庆黄金周&#xff0c;各地精心筹备&#xff0c;打造了丰富多彩的文化旅游盛宴&#xff0c;吸引了来自四面八方的游客。凭借各地的自然风光、丰富的人文景观以及精彩纷呈的旅游活动&#xff0c;吸引众多游客。此次国庆旅游市场的火爆&#xff0c;不仅为当地带来了可观的经…

C语言预处理详解(上)(30)

文章目录 前言一、预定义符号二、#define定义标识符三、#define定义宏四、#define的替换规则五、带有副作用的宏六、宏和函数的对比七、#undef的作用八、# 和#的作用##的作用 总结 前言 C语言的入门学习差不多要到尾声了&#xff0c;感觉如何呢~   前文说编译的第一步就是预编…

ax1.twinx()函数介绍

目录 ax1.twinx()实战 ax1.twinx() ax1.twinx() 是 Matplotlib 中用于创建共享 x 轴的双 y 轴的函数。在 Matplotlib 中&#xff0c;当我们希望在同一图中显示不同的数据集&#xff0c;但它们具有相同的 x 轴数据时&#xff0c;可以使用 twinx() 函数创建一个新的坐标轴&#…

(五)、CT球管

第一代和第二代扫描仪使用固定阳极、油冷的X射线管&#xff0c;但由于对输出功率增加的需求&#xff0c;旋转阴极X射线管在CT中变得普遍。 传统固定阳极CT管&#xff0c;当阴极钨丝通过足够的电流时&#xff0c;使其产生白热现象时电子会从钨的表面逸出形成电子云&#xff0c;通…

Lazada菲律宾本土店选品怎么操作?EasyBoss ERP选品功能来帮你!

由于Lazada本土店在流量、履约速度、类目限制以及回款速度方面的优势&#xff0c;越来越多的Lazada卖家都在考虑转型做本土店&#xff0c;但本土化落地并不是一件容易的事&#xff0c;很多卖家在选品阶段就踩大坑了。 因此&#xff0c;为了选品不踩坑&#xff0c;很多卖家都会…

阿里云物联网自有app创建之初始化SDK

文章目录 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生成apk二、上传apk&#xff0c;集成安全图片&#xff0c;下载SDK三、SDK的集成四、初始化SDK 最近在研究阿里云自有app,这是自己的心得。 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生…

【论文阅读】超分辨率图像重建算法综述

0. 摘要 研究背景和意义 在人类视觉感知系统中&#xff0c;高分辨率&#xff08;HR&#xff09;图像对于清晰表达空间结构、细节特征、边缘纹理等信息至关重要&#xff0c;在医学、刑侦、卫星等多个领域具有广泛实用价值。超分辨率图像重建&#xff08;SRIR&#xff09;旨在从低…

MQTT vs HTTP:谁更适合物联网?

前言 随着物联网&#xff08;IoT&#xff09;技术的飞速发展中&#xff0c;其应用规模和使用场景正在持续扩大&#xff0c;但它关键的流程仍然是围绕数据传输来进行的&#xff0c;因此设备通信协议选择至关重要。 作为两种主要的通信协议&#xff0c;MQTT 协议和 HTTP 协议各…

AI提示工程:掌握高效Prompt设计的终极指南

导读 提示工程&#xff08;Prompt Engineering&#xff09;是一门新兴的学科&#xff0c;专注于提示词的开发和优化&#xff0c;旨在帮助用户在各种场景和研究领域中更好地利用大语言模型&#xff08;Large Language Model, LLM&#xff09;。掌握相关的提示工程技能将有助于用…

想提升发明专利审查速度有哪些快捷方法?

在创新驱动的时代&#xff0c;发明专利的审查速度对于企业和发明者来说至关重要。了解发明专利的审查程序以及掌握加快审查的快捷途径&#xff0c;能够帮助申请人更快地获得专利授权&#xff0c;保护其创新成果。 一、目前发明专利的审查程序 1. 申请提交&#xff1a;申请人需…

2024年10月上旬更新的6场AI大赛来了,总奖金池:22.9万

亲爱的朋友们&#xff0c;2024年10月的AI大赛最新资讯已上线&#xff01;不要错过这些精彩赛事&#xff0c;快来关注吧&#xff01; 本期我们为您精选了6场AI大赛&#xff0c;主要集中在AI绘画和AI视频创作领域&#xff0c;还有一场别开生面的开放式答题竞赛。这些大赛均由政府…

Java | Leetcode Java题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; class Solution {public int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s ! 0) {s & s - 1;ret;}return ret;} }

线性ADRC(LADRC)系统算法框图

非线性ADRC(NLADRC)详细算法框图和源代码请参考专栏系列文章,常用链接如下: 1、NLADRC自抗扰控制 NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-CSDN博客文章浏览阅读1.6k次,点赞2次,收藏7次。本文介绍了如何将ADRC自抗扰控制算法从Simulink…

基于Renesas R7FA8D1BH (Cortex®-M85)自适应蓝牙控制智能小车

目录 概述 1 系统框架结构 2 系统硬件介绍 2.1 电机驱动控制结构 2.1.1 PWM控制小车接口介绍 2.1.2 小车运行方向控制原理 2.2 外围传感器接口 2.2.1 I2C接口设备 2.2.2 IO接口 2.2.3 UART接口 2.2.4 其他接口 2.3 障碍物监测接口 2.4 测速模块接口 3 系统软件架构…