CAN硬件协议详解
一、基本理论:
1、CAN的总线结构: CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。 闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两根差分信号线形成了回路;这种CAN总线网络由ISO 11898标准定义,是 高速、短距离 的CAN网络,通信速率为125kbit/s~1Mbit/s;当以1Mbit/s的速率通信时,总长度最长40米。结构示意图: 开环结构的CAN网络总线,两根信号线独立,各自串接一个2.2kΩ的电阻;这种CAN总线网络由ISO11519-2标准定义,是 低速、远距离 传输的CAN网络,通信速率最高为125kbit/s;在40kbit/s的通信速率下,传输最远距离可达1000米。结构示意图: / 2、CAN总线的电平信号格式: CAN的两根信号线 CANH-CANL 之间的电压差表示CAN信号的电平,与传输数据的逻辑信号1和0对应;对应于 逻辑1称为隐性 电平,对应于 逻辑0称为显性 电平。如下图所示,上半部分为实际CANH和CANL的电平,下半部分是对应的逻辑电平: 对于 逻辑0和逻辑1 ,开环结构和闭环结构 的CAN网络中的 CANH和CANL 的电压值不一样,隐性电平和显性电平的电压差也不一样。这两种网络结构下的CAN总线信号典型的电压如下表所示: / 3、CAN网络典型电路结构: 在CAN总线网络结构中,CAN总线上的一个终端设备称为节点,在CAN网络中,没有主设备和从设备的区别。一个CAN节点设备 的硬件部分,一般由 CAN控制器(外设)和CAN收发器(PHY) 组成;CAN控制器 负责CAN总线的逻辑控制,实现CAN传输协议;CAN收发器 主要负责MCU逻辑电平与CAN总线电平之间的转换。CAN收发器 需要根据 CAN总线结构来选择,闭环结构 与 开环结构 不同。 / 4、CAN总线的特点: 1、实时性:CAN总线具有优越的实时性能,适用于需要及时传输数据的应用;如汽车控制系统、工业自动化等。仲裁机制和帧优先级 的设计保证了低延迟和可预测性。 2、多主机系统:CAN支持多主机系统,多个节点可以同时发送和接收数据;这种分布式的网络结构使得系统更加灵活,适用于复杂的嵌入式网络。CAN总线上的节点既可以发送数据又可以接收数据,没有主从之分;但在同一个时刻,只能由一个节点发送数据,其他节点只能接收数据。 3、差分信号传输:CAN使用差分信号传输,通过两个线路(CAN_L 和 CAN_H)之间的电压差来传递信息;这种差分传输方式提供了良好的抗干扰性能,使得CAN总线使用于工业环境等有电磁干扰的场合。 4、仲裁机制:CAN总线采用 非破坏性仲裁机制,通过 比较消息标识符的优先级来决定哪个节点有权继续发送数据;这种机制确保了总线上数据传输的有序性,避免冲突。 5、广播通信:CAN总线采用广播通信的方式,即发送的数据帧可以被网络上所有的节点接收(但不一定处理)。 6、多种帧类型:CAN总线上的节点没有地址的概念(CANOpen则利用COD_ID来实现了节点地址概念);CAN总线上的数据是以帧为单位传输的,帧又分为 数据帧、遥控帧等多种帧类型。 7、线与逻辑(实现仲裁的原理):CAN总线具有“线与”的特性;也就是 当由两个节点同时向总线发送信号时,一个是发送显性电平(逻辑0),另一个是发送隐性电平(逻辑1),那么电路最终将呈现为显性电平。这个特性被利用实现 总线的仲裁机制,也就是总线上哪个节点优先占用总线发送数据。 8、特定标识符(COB_ID):每一个帧有一个标识符(Identifier)ID。单单对于CAN总线来讲,ID不是地址,它表示传输数据的类型,也可以用于总线的仲裁时确定优先级。 9、滤波特性:每个CAN节点都接收数据,但可以根据数据帧的ID号进行过滤。只有节点需要的数据才会被接收并进一步处理,不需要的数据会被自动丢弃。 / 5、CAN的位时序和波特率: CAN网络通信为异步通信,需要规定一个通信的波特率,各个节点都以相同的波特率进行数据通信。位时序是指 一个节点采集CAN总线上的一个位数据的时序;位时序同步图如下: 图中的 标称位时间(NBT)指的是 传输一个位的数据 时间;用于确定CAN总线的波特率,这个事件被分为3段: 1、同步段(SYNC_SEG):在这个时间段内,总线上应该发送一次位信号的跳变;如果节点在同步段检测到总线上的一个跳变沿,就表示节点与总线是同步的;同步段长度固定一个tq(时间片)。 2、位段1(BS1):定义了采样点的位置;在BS1结束的时间点对总线采样,得到的电平就是这个位的电平。BS1的初始长度有1~16个tq,但它的长度可以在同步的时候被自动加长,以弥补各节点频率差异导致的正相位偏移。 3、位段2(BS2):定义了发送点的位置,BS2的初始长度是1~8个tq;再同步时可以自动缩短,以补偿负相位偏移。 CAN控制器可以自动对位时序进行再同步,再同步时自动调整BS1和BS2的长度;位段加长或缩短的长度称为 再同步跳转宽度;其取值一般在1~4个tq之间。 单片机中的CAN控制器时钟配置???tq(time quantum)被称为时间片,tq由CAN控制器的时钟频率fcan决定。在STM32F407中,两个CAN控制器在APB1总线上,CAN控制器有预分频器,APB1总线的时钟信号PCLK1经分频后得到fcan。 / |
二、CAN总线协议结构:
1、OSI模型: CAN协议涵盖了OSI规定的OSI基本参照模型当中的 传输层、数据链路层以及物理层。OSI基本参考表如下: CAN协议中关于 ISO/OSI基本参照模型中的 传输层、数据链路层和物理层,具体的定义如下图: 其中,数据链路层 分为 MAC层和LLC层;MAC子层是CAN协议的核心部分。 2、ISO标准化的CAN协议: CAN协议经 ISO标准化 后有 ISO11898标准和ISO11519-2标准 两种;这两种标准 对于数据链路层的定义相同,对于物理层(PHY)不同。 关于ISO11898协议,其规定的通信速率为125kbps~1Mbps。关于ISO11519-2标准,其规定的通信速率为125kbps。如下图所示: |
三、CAN各种类型的帧详解:
1、帧的种类: CAN网络通信是通过5种类型的帧进行的:数据帧、遥控帧、错误帧、过载帧、帧间空间;其中,数据帧和遥控帧 有标准格式和扩展格式 两种,标准格式有11位的标识符(GOB-ID),扩展帧则为29位的ID;各种帧的用途如下表所示: /// 2、数据帧: 数据帧由7个段构成,具体格式如下图所示: 帧起始:表示数据帧开始的段,包含1个位的显性电平(逻辑“0”)。 仲裁段:表示该帧优先级的段(大端位序),标准帧和扩展帧,此结构有所不同;如下图: 控制段:表示数据的字节数以及保留位(r0 r1)。控制段由 6个位 组成,用于表示 数据段的字节数;标准帧和扩展帧格式不同,如下图: 数据段:数据内容载体,可发送0~8个字节的数据。数据发送格式MSB(最高位)开始输出,标准帧和扩展帧都是一样的格式;如下图: CRC段:检查帧传输错误的段。由 15个位的CRC和1个位的界定符 构成,其中,界定符为 隐形电平(逻辑“1”);如下图所示: ACK段:表示确认正常接收的段。ACK段有2个位,用于确认 数据帧接收是否正常,由 ACK槽和ACK界定符 构成;如下图所示: 帧结束:表示该帧结束的段。由7个隐性电平位构成,如下图: /// 3、遥控帧: 接收单元向发送单元请求发送数据所用的帧;遥控帧 由 6个段组成,是 没有数据段 的数据帧。具体格式如下图: 数据帧与遥控帧的对比: /// 4、错误帧:(后面有详细解释) 用于在接收和发送消息时,检测出错误通知错误的帧;错误帧由 错误标志和错误界定符 构成,错误帧的具体如下图: 错误标志:错误标志包括 主动错误和被动错误 两种,主动错误为 6个显性位,被动错误为 6个隐性位。 错误界定符:错误界定符由 8个隐性 位组成。 主动错误 与 被动错误 的区别:主动报错,就是出现错误时,节点设备主动发送6个显性位(强行占用总线)的错误帧通知其他节点设备,我错了;被动错误,就是节点发生错误时,不会主动报错,而是等待别的节点发现它出错了,然后发出被动错误帧。 /// 5、过载帧: 过载帧用于 接收单元通知其尚未完成接收准备 的帧;过载帧由 过载标志和过载界定符 构成。过载帧可以理解为特殊的主动错误帧。如下图所示: 过载标志:由 6个位的显性位 组成,与主动错误帧一样。 过载界定符:由 8个位的隐藏位 组成,与 错误帧的错误界定符一样。 /// 6、帧间隔: 帧间隔 用于将 数据帧和遥控帧 与 其他任何数据帧 分隔开;过载帧和错误帧 前 不能插入间隔帧。间隔帧的格式如下图: 间隔:3个位的隐性位; 总线空闲:隐性电平,无长度限制。 延迟传送:8个位的隐性位,只在处于被动错误状态的节点,刚发送一个消息后,帧间隔中包含的段。 /// |
四、CAN总线的优先级与同步:
1、优先级的决定: 在总线空闲状态,最先开始发送消息的单元获得发送权;多个单元同时发送时,各发送单元从仲裁段(COB-D)的第一位开始进行仲裁,连续输出显性电平最多的单元可继续发送;在仲裁的过程中,若 前面单元1是隐性电平,单元2是显性电平,显性优先级更高,则单元2的优先级更高,获得优先权,如下图所示: 总结: 1、先发送的优先; 2、显性电平靠前的优先; 3、显性电平多的优先; /// 2、数据帧和遥控帧的优先级: 具有相同ID号的 数据帧和遥控帧 在总线上竞争时,仲裁段的最后一位(RTR)为 显性电平 的数据帧具有优先权(数据帧具有优先权);如下图所示: /// 3、标准格式和扩展格式的优先级: 标准格式ID与具有相同ID的遥控帧 或者 扩展格式的数据帧 在总线上竞争时,标准格式的RTR位为显性电平(且位置靠前)具有优先权,可以继续发送。 /// |
五、总线错误的种类:
CAN总线的错误共有5种,且多种错误可能同时发生。如下表所示: /// 1、位错误的特殊情况: ① 位错误由 向总线上输出数据帧、遥控帧、错误帧、过载帧的单元 和 输出ACK的单元、输出错误的单元 来检测; ② 在仲裁段输出隐性电平,但 检测到显性电平,属于 仲裁失利,不属于 错误; ③ 在 仲裁段的填充位 输出隐性电平,但 检测到显性电平,将 不被 视为位错误,而是 填充错误; ④ 发送单元在ACK段输出隐性电平,但检测到显性电平时,将认为 得到应答,而非 错误; ⑤ 输出 被动错误标志(6个隐性位)但检测出显性电平时,将遵循 错误标志的结束条件,等待检测出 连续相同的6个位的值(显性或隐性),并不视为 位错误; /// 2、格式错误的特殊情况: ① 即使接收单元检测出 EOF(7个位的隐性电平)结束标志 的第8位为显性电平,也不认为是 格式错误; ② 即使接收单元检测出 数据帧中的DLC(数据字节数)有9~15的值时,也不认为是 格式错误; /// 3、错误帧的输出规则: 检测到满足错误条件的单元输出错误标志通道错误;处于主动错误状态的节点输出的错误标志为主动错误标志;处于被动错误状态的节点输出的错误标志为被动错误标志;发送单元发送完错误帧后,将再次发送数据帧或遥控帧;错误标志输出时序如下图: /// |
六、位时序与同步机制(重要):
1、位时序: 由 发送单元在非同步的情况下发送的每秒钟的数据的位个数,称为 位速率;一个位可分为4个同步时间段:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。 这些段又可以被称为 Time Quantum(以下称为Tq)的 最小时间单元 构成;1个位分为4个段,每个段又由若干个Tq构成,这称为 位时序。那么,1个位由多少个Tq构成,每个段又包含多少个Tq,这个是可以任意设定位时序的;通过设定位时序,多个节点单元可以同时采样,也可以任意设定数据采样点。1个位的位时序如下图: 2、取得同步的方法: CAN协议的通信方法为 NRZ(Non Return to Zero)。各个位的开头和结尾都没有附加同步信号;发送单元以 与位时序同步的方式 开始 发送数据;另外,接收单元根据 总线上电平的变化 进行同步并进行接收工作。 但是,发送单元 和 接收单元 存在的 时钟频率误差 以及 传输路径上的相位延迟 会引起同步偏差。因此接收单元 通过硬件同步 或者 再同步 的方法调整时序进行接收。 3、硬件同步: 接收单元在 总线空闲状态 检测到 帧起始 时的同步调整:在检测到边沿信号的地方,忽略SJW的值而认为它是SS段;如下图所示: 4、信号再同步: 在 接收过程中 检测出 总线上的电平信号变化 时的同步调整:每当检测出边沿时,根据SJW值通过 加长PBS1段或缩短PBS2段 ,以调整同步;如下图所示: 目的就是:保证采样点在电平稳定时采样。 5、调整同步的规则: 硬件同步和再同步需要遵循以下规则: ① 每个位数据只进行一次同步; ② 只有当 上一次的采样点的总线值与边沿后的总线值 不同时,该边沿才可以用于同步??? ③ 在 总线空闲且存在隐性电平到显性电平的边沿信号 时,一定要进行一次 硬件同步; ④ 在总线非空闲时,检测到隐性电平和显性电平的边沿且满足条件①和②时,将进行 再同步;但还要满足下面的条件: ⑤ 发送单元检测到 自身输出的显性电平 有延迟时,不再进行在同步; ⑥ 总线上 存在多个发送单元同时发送时且处于仲裁段,不再进行再同步; |
七、单片机上CAN外设的一般驱动配置(需要进一步实践!!):
1、位时序配置示例: tq=CAN分频/外设时钟频率*1s;具体规则以实际的芯片说明为准; 这里有一个误差计算方式: 位时间的四个段具体如何分配时间片,芯片厂商一般会有建议值,如果没有,则按照前面所说配置,最后计算一下误差,保证小于1%。 2、STM32的时序配置描述: 3、新塘MCU上CAN外设的时序配置: |
相关文章:

CAN硬件协议详解
一、基本理论: 1、CAN的总线结构: CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。 闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两…...

网络安全等级保护:网络安全等级保护基本技术
下面我们概括性探讨一下等级保护用到的一些技术,有关这些技术的每一个方面的每一个部分都可以是一部大块头,甚至一部大块头都无法介绍清楚,需要系列性的书籍去展开,所以这里也只能做到抛砖而已。期望起到抛砖引玉的作用࿰…...

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...

数据结构课程设计(java实现)---九宫格游戏,也称幻方
【问题描述】 九宫格,一款数字游戏,起源于河图洛书,与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…...
[思考记录]AI时代下,悄然的改变
尝试用 xAI-Grok 去了解DS开源周的信息,有那么点被Grok的输出惊艳到。“请你以技术编辑的角色,重点参考官方文档,介绍DeepSeek开源周的内容,写一篇技术分享文章。”,得到的文字看起来很是舒服,内容靠谱、结…...
JAVA笔记【一】
现实 (抽象) 类 (创建) 对象 特点: 1.面向对象 2.跨平台 3.安全性 4.多线程 java程序基本结构 1. java源代码文件实际是普通的文本文件,源代码文件必须是.java扩展名,且必须小写 2. …...
[Java基础] 常用注解
文章目录 1. 元注解2. 非元注解2.1 常用JDK自带注解2.2 常用Spring相关注解2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分2.2.2 针对controller的相关注解2.2.3 AOP相关注解2.2.4 Enable系列注解 2.3 常用Lombok注解 1…...
uvm中的run_test作用
在SystemVerilog和UVM验证环境中,run_test() 是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行 1. run_test() 的作用 run_test() 是UVM提供的内置函数,定义在UVM库中…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
C#内置委托(Action)(Func)
概述 在 C# 中,委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。C# 提供了一些内置委托,使得开发者可以更方便地使用委托功能,无需手动定义委托类型。本文将详细介绍 Action 和 Func 这两个常用的内置委托。 A…...
kubernetes 部署项目
随着容器化技术的发展,使用Kubernetes(简称K8s)来部署和管理应用已经成为现代软件开发的标准实践之一。Kubernetes提供了一套强大的工具集,使得部署、扩展和管理应用程序变得更为简便高效。本文将带你走过从准备环境到部署一个实际…...

《几何原本》命题I.2
《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点, B C BC BC 为给定线段 连接 A B AB AB,作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心, B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…...

【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
nvm的学习
学习 nvm(Node Version Manager) 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南,涵盖从基础到进阶的内容: 一、基础入门 1. nvm 的核心作用 多版本共存:安装和管理多个 Node.js 版本ÿ…...

haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...

stm32(hal库)学习笔记-时钟系统
在stm32中,时钟系统是非常重要的一环,他控制着整个系统的频率。因此,我们有理由好好学一下时钟系统。 什么是时钟? 时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单…...

【Java项目】基于SpringBoot的财务管理系统
【Java项目】基于SpringBoot的财务管理系统 技术简介:采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构,前端通过浏览器与后端数据库进行信息交互,后端使用SpringBoot框架和MySQL数据库进行数据处理和存储,实现…...

Qt中如果槽函数运行时间久,避免阻塞主线程的做法
Qt中如果槽函数运行时间久,避免阻塞主线程的做法 一、解决步骤 创建一个工作线程类:继承自QObject,并在其中实现槽函数的逻辑。将工作线程类的实例移动到单独的线程中:通过moveToThread()方法将对象移动到新线程。启动线程&…...

曹操智行构建国内首个全域自研闭环智驾生态
2月28日,曹操出行举办曹操智行自动驾驶平台上线仪式,宣布已成功构建国内首个“F立方”全域自研闭环智驾生态,同时在苏杭两地开启Robotaxi运营试点,并投放搭载吉利最新智驾系统的车辆。 此次试点运营,标志着曹操出行在…...

day02_Java基础
文章目录 day02_Java基础一、今日课程内容二、数组(熟悉)1、定义格式2、基本使用3、了解数组的内存图介绍4、数组的两个小问题5、数组的常见操作 三、方法(熟悉)1、定义格式2、方法重载overload 四、面向对象(掌握&…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...