STM32——CAN协议

文章目录

  • 一.CAN协议的基本特点
    • 1.1 特点
    • 1.2 电平标准
    • 1.3 基本的五个帧
    • 1.4 数据帧
  • 二.数据帧解析
    • 2.1 帧起始和仲裁段
    • 2.2 控制段
    • 2.3 数据段和CRC段
    • 2.4 ACK段和帧结束
  • 三.总线仲裁
  • 四.位时序
  • 五.STM32CAN控制器原理与配置
    • 5.1 STM32CAN控制器介绍
    • 5.2 CAN的模式
    • 5.3 CAN框图
  • 六 手册寄存器部分讲解
    • 6.1 DBF冻结功能和TTC时间戳
    • 6.2 ABOM自动离线管理和AWUM自动唤醒
    • 6.3 NART自动重传,RFLM锁定模式和TXFP报文发送优先级的判断方法
    • 6.4 波特率设置
    • 6.5 发送邮箱
    • 6.6 接收FIFO
    • 6.7 验收筛选器
  • 七.CAN的结构体设置讲解
    • 7.1 结构体总结
    • 7.2 初始化结构体
    • 7.3 发送结构体
    • 7.4 接收结构体
    • 7.5 筛选器结构体
  • 八.CAN的原理图和接线

一.CAN协议的基本特点

1.1 特点

在这里插入图片描述

1.2 电平标准

总结就是显性电平是0,隐性电平是1,很多单元设备挂在主设备上时,主单元是相当于总线,其他单元只要有一个输出0,总线就显示0,只要其他单元全部输出1,总线就是1

在这里插入图片描述

1.3 基本的五个帧

这里最重要的是数据帧,也是最复杂的
在这里插入图片描述

1.4 数据帧

串口的一帧率是10-11位,起始位,数据位8位(一字节),(校验位),停止位,而CAN的一帧是七个段组成的,如下图所示,帧起始就是跟串口起始位一样,仲裁段是表示优先级,也就是ID,控制段如下图,一帧数据段最多发送8字节(64位),CRC段就是检查上面的所有段有没有错误,ACK表示收到了正确的段,帧结束就是相当于串口的停止位。

在这里插入图片描述

二.数据帧解析

2.1 帧起始和仲裁段

帧起始是一位显性电平0,然后到11位的仲裁段(看蓝色区域,高低电平看ID号,高位在前,低位在后,这里ID11位的话,高7位是不能都是隐形电平1),然后仲裁段后面跟了一个RTR远程请求位0或者1和一个IDE标识符选择请求位0(这里没有显示出来,因为在控制段里面了),RTR如果是0就是数据帧,数据帧的意思就是后面的数据段是有数据的,如果是1,表示这是一个远程帧,远程帧的意思就是后面的数据段是不存在的,DLC控制段也是0的,远程帧用于请求其他节点发送数据帧。上面说的仲裁位都是标准格式,如果需要扩展,在仲裁位的基础下,把原来的RTR替换成SRR替代远程请求位1,IDE变成扩展标识符1。
在这里插入图片描述

2.2 控制段

标准格式下,IDE就是上面说的,在控制段里面为0,然后就是R0,发送的话必须是0,接受的话可以是1,再加上控制段DLC(0—8位),扩展格式下,先r1和r0两个保留位,也是发送必须是0,接受可以是1,再加上DLC控制端(0—8位)。
在这里插入图片描述

2.3 数据段和CRC段

(1).数据段的标准格式和扩展格式是一样的都是0-64位,然后数据段是从最高位(MSB),开始输出的,跟串口不一样,串口是低位(LSB)先输出,而CAN是高位先输出的。

(2).CRC段也是标准格式和扩展格式一致都是15位加上一位CRC界定符(用于分隔的位),CRC计算方法就是帧起始+仲裁段+控制端+数据段,最后校验得到这个。

在这里插入图片描述

2.4 ACK段和帧结束

(1).ACK段的标准格式和扩展格式是一致的,ACK段分为ACK槽和ACK界定,发送单元发给接受单元的数据没有错后(CRC检测没有错误以后),发送单元会接受到接受单元发送的发送单元ACK段11,发送单元接受到了接受单元发的ACK后,会有一个响应,就是接受单元ACK段0。

(2).帧结束的标准格式和扩展格式是一样的,由于7个位的1组成。
在这里插入图片描述

三.总线仲裁

(1).必须同时两个或者两个以上的单元发送数据给主单元,才能进行仲裁(优先级),在总线空闲时,最先发送的单元获得发送权,或者同时发送时,则连续输出0(ID)多的单元,则优先发送,如果ID一样,则比较RTR和SRR等位。

(2).例如下图,单元1和单元2同时发送,单元1在红色位置时发送1,而单元2还是发送0,所以,单元1从下一位开始就进入接受状态,单元2优先发送。
在这里插入图片描述

四.位时序

(1).位时序就是设置波特率(传输速度),位速率就是一个发送单元发送每秒的位数叫做位速率(传输速度),位速率又分成四个段(如下图一),CAN协议把每个数据位(数据位就是例如串口里面那个起始位,数据位什么的)都分解成了四段,每个段又由若干个Tq的最小时间单位构成,然后我们想设置波特率的话,就要知道位时间(传输每位的时间),想设置位时间的话,就要知道波特率,位时间=1/波特率。

(2).四个段如图二进行解析。

(3).同步段就是有多个连接在总线上的单元通过此段进行时序调整来同时发送和接受数据,时序都是1到0的一个下降沿,或者0到1的一个上升沿,如图三,这些跳变作为时间基准,用于进行时钟同步和数据位的采样,为1Tq。

(4).传播时间段就是总线上的信号传播延迟,接收单元的输入延迟和发送单元的输出延迟,这个传播时间段的时间为总线上的信号传播延迟,接收单元的输入延迟和发送单元的输出延迟的时间的和的2倍,通常是1—8Tq。

(5).相位缓冲段1的作用是当信号边沿不能被包含于同步段中时,可以用它来进行补偿,通常为1-8Tq。

(6).相位缓冲段2的作用就是各个单元以独立时钟工作时,细微的时钟累计起来就会造成误差,它的作用就可以吸收这个误差。可以通过相位缓冲段加减SJW(SJW名为再同步补偿宽度,用于时钟频率偏差,传送延迟等各个单元有同步误差,SJW可以补充此误差的最大值,SJW不属于这四个段的,为1—4Tq)来吸收误差,SJW加大以后允许误差加大,但是通信速度降低,相位缓冲段2通常为2—8Tq。

(7).在STM32上面传播时间段和相位缓冲段1是加在一起的BS1,然后相位缓冲段2是BS2,就只有这两个时间。

(8).图四是位时序的构成,是假设以1位=10Tq的构成,这个采样时间的加大或者减少的最大值就是SJW,也就是SJW可以调节采样点。

(9).我们只需要设置传播时间段,相位缓冲段1,相位缓冲段2和SJW的值,剩下的都是硬件自动去完成。

图一

在这里插入图片描述
在这里插入图片描述

图二
在这里插入图片描述

图三
在这里插入图片描述
图四
在这里插入图片描述

五.STM32CAN控制器原理与配置

5.1 STM32CAN控制器介绍

对于STM32F407过滤器组有28个,STM32F103就有14个。
在这里插入图片描述

5.2 CAN的模式

(1).CAN的模式分为工作模式,测试模式和调试模式,工作模式又分为三个模式,如图一,一开始就需要初始化模式,初始化后,设置正常模式(CAN控制器既可以向总线发也可以接收总线的数据),就可以开始工作了,睡眠模式主要用来降低功耗用的。

(2).测试模式的静默模式是指在STM32的CAN控制器中,静默模式通常是指CAN控制器只接收数据而不发送数据。在静默模式下,CAN控制器仍然能够接收总线上的数据帧,但它不主动发送数据,如图二,发送端一直都处于1的状态。

(3).在图三中,测试模式的环回模式可以往总线上面发送数据,但是总线发送数据过来不能接收,也就是他只能发送数据不能接收,然后怎么知道发送成功了呢,它内部有形成环路,可以检测把发送的数据,最后在接收端看有没有发送成功。

(4).最后在图四中,是环回静默模式,总线上不能发数据给它,它也不能接收总线上的数据,只能自己给自己发送,用来测试,用的很少。

图一
在这里插入图片描述

图二
在这里插入图片描述
图三
在这里插入图片描述
图四
在这里插入图片描述

5.3 CAN框图

(1).下图一中,在STM32F103里面只有互联型产品才有两个CAN,一个是主CAN,另一个是从CAN,其他的只要有一个主CAN,但是在STM32F407里面就有主从CAN。

(2).在图二中,主从CAN都有自己的内核(红色圈),也有各自的主从发送邮箱(蓝圈)和各自的主从接收FIFO(黄圈),都是相互独立的,互不影响,筛选器又称过滤器,STM32F407和STM32F103互联型的才有28个,两个主从CAN是共用一个过滤器的(绿圈),每个CAN的发送邮箱一共是有3个,发送报文的优先级可以使用软件进行控制,还可以记录发送时间,然后每个CAN拥有两个3级深度的接收FIFO,可以使用过滤功能只接收或者不接受某些ID号的报文,可以配置成自动重发,不支持使用DMA进行数据收发。

(3).在图中右下角写了一句话,CAN的开始滤波器编号n是通过写入CAN FMR寄存器的CAN2SB[5:0]配置,这个n是指,比如n是2,那你滤波器就从编号为2到27的硬件过滤器来匹配和过滤CAN消息,过滤器的使用范围并不包括编号为0和1的过滤器。

(4).CAN的内核就是设置那些工作模式什么什么等等,然后我们把需要发的报文发到发送邮箱存着,等到总线空闲就开始发送,有多个单元的话,就根据优先级进行发送,然后就是我们的接受FIFO,总线发送给接受FIFO的数据要结果筛选器(滤波器)才能存到接受FIFO里面,如果总线有很多很多数据要发送,我们节点只要接受某一类的信息数据,这个筛选器就可以筛选掉,就不需要全部收到接受FIFO里面在进行软件筛选。

(5).然后最重要的一点就是如果你只使用从CAN控制器,那也要使能主控制器的时钟,因为是由主CAN控制的。

图一
在这里插入图片描述
图二
在这里插入图片描述

六 手册寄存器部分讲解

6.1 DBF冻结功能和TTC时间戳

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2 ABOM自动离线管理和AWUM自动唤醒

在这里插入图片描述

6.3 NART自动重传,RFLM锁定模式和TXFP报文发送优先级的判断方法

(1).在下图中的RFLM锁定模式,如果不锁定,每个CAN控制器有六个报文,在六个报文满了以后,他会继续发,0,1,2,3,4,5,他会把0给覆盖了。
(2).然后就是下图的TXFP,报文发送优先级判断,比如发送邮箱0,1,2,我们先存把要发的东西先存进0,再存1,再存2邮箱,然后存进来的ID号是0的优先级最高,然后到2,在到1邮箱,这时候,我们可以控制TXFP选择是先存进来的先发送还是看ID优先级发送。
在这里插入图片描述

6.4 波特率设置

(1).BS1就是下图的TS1,然后如果写2就等于2+1(Tq),BS2就等于下图的TS2,也是+1。
(2).一个数据位的时间时间如下图,Tplk=1/f,这里挂载在stm32f103的APB1,由于预分频系数为1,所以时钟为32Mhz。

(3).N就是一个数据位的时间T1bit。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
配置的流程,如下图
在这里插入图片描述

6.5 发送邮箱

(1.)下图手册的黄线是ID号,也就是STID,然后IDE是标识符选择,选择使用标准标识符11位还是扩展标识符29位,EXID对扩展标识符写的,这里没有使用,就不需要使用扩展标识符,对标识符寄存器中的CAN_TIxR中的TMIDxR_TXRQ置1,这样子邮箱发完数据后,会进行硬件清0。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.6 接收FIFO

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.7 验收筛选器

(1).STM32F4有28组筛选器(滤波器),STM32F103有14个组筛选器,每组筛选器有2个32位寄存器,每个寄存器可以过滤一个ID号,STM32F103最多就可以滤掉28个ID号。

(2).在图一中,过滤的方法有两种,一种是标识符列表模式,就是要接收的报文列成一个表,要求报文ID与列表中的某一个标识符完全完全相同都可以接收,,它设置5—7组的ID,然后你发的5—7组的ID,正好与接收的要求一样,就可以了,如果6组不一样,就只接收5和7;另一种是掩码模式,意思就是接收报文设置几个关键字,例如设置高四位是1111剩下的是xxxxxxx什么的,只要你高四位是1111,就可以接收。

(3).筛选长度,每个筛选器组由2个32位寄存器组成,然后每个筛选器组可以设置成一个32位筛选器或者两个16位筛选器,然后,在图二中,这一个32位筛选器或者两个16位筛选器和标识符列表模式跟掩码模式又搭配成四种工作模式。

(4).一个32位筛选器和两个16位的筛选器的标识符掩码模式,比如输入的ID号是10101…,然后我们想要10101是关键字的话,就掩码为11111,然后后面的配置为0,就是不需要管后面,关键字就是前面的10101,如图三。

(5).两个32位的筛选器的标识符列表模式,,2个寄存器存储的都是要筛选的ID(这里因为一个筛选器组使用32位时就只使用了一个寄存器,所以这里两个寄存器就是两个筛选器组),它只包含2个要筛选的ID值,然后例如筛选器组0和筛选器组1的筛选的ID是6和7的话对应的是6和7就筛选成功,最后在存储进来接收FIFO里面。

图一
在这里插入图片描述

图二
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
图三
在这里插入图片描述

七.CAN的结构体设置讲解

7.1 结构体总结

(1).初始化结构体就是设置波特率,工作模式,每个位有多长,构成。

(2).发送及接收结构体设置发送邮箱和接收报文FIFO。

(3).筛选器结构体可以设置筛选器过滤那些报文。

在这里插入图片描述

7.2 初始化结构体

(1).在图一中是初始化结构体全部的初始化。

(2).在图二中的参数是工作模式,从上往下分别是正常模式,环回模式,静默模式,环回静默模式。

(3).SJW是在文章四目录里面有记录,是再同步补偿宽度,设置1-4Tq,如图三。

(4).BS1也是文章目录四记录,参数如图四,计算波特率公式也在目录六的6.4。

(4).

图一
在这里插入图片描述
图二
在这里插入图片描述
图三
在这里插入图片描述
图四
在这里插入图片描述
图五
在这里插入图片描述

7.3 发送结构体

(1).图一是发送结构体的成员。

(2).想要发送数据时,可以调用图二的函数,第一个参数是选择使用哪个CAN(主从CAN),然后发送的报文就是第二个参数——结构体成员,然后发送数据时,它会存进去邮箱里面,然后在哪个邮箱空闲时,就先存进去哪个邮箱,返回值就是告诉你存进去了哪个邮箱里面——0,1,2邮箱,然后还有一给发送状态的函数,如图四,第一个参数是选择主从CAN,第二个参数是查找哪个邮箱,哪个邮箱就是图二函数的返回值进行查找,如果成功了,这个函数会返回返回值成功或者失败(图四中)。

(3).然后发送结构体的StdId就是标准标识符ID号,ExtId在手册上是扩展标识符ID号,但是这里的结构体ExtId是手册上的标准标识符ID号和扩展标识符ID号加在一起了,一共29位,然后IDE是选择是结构体StdId还是ExtId,在图三中是IDE的参数配置,从上到下是:标准标识符,扩展标识符和标准标识符+扩展标识符。

(4).RTR就是选择是数据帧还是远程帧(具体详解见目录二的2.1),然后图五从上到下的参数分别是数据帧和远程帧。

图一

在这里插入图片描述

图二
在这里插入图片描述
图三
在这里插入图片描述
图四
在这里插入图片描述
图五
在这里插入图片描述

7.4 接收结构体

(1).图一是接收结构体的成员

(2).如果想要接收报文,就使用图二这个函数,第一个参数选择主从CAN,第二个参数就是选择FIFO的号—0或者1,然后接收的报文就是第三个参数——结构体成员,接收结构体比发送结构体多了一个FMI结构体成员,FMI存储了筛选器的编号,表示是本报文是是经过哪个筛选器存储进来接收FIFO的。

(3).然后怎么知道是哪个FIFO里面有数据呢,就用图三的函数。

图一
在这里插入图片描述
图二
在这里插入图片描述
图三
在这里插入图片描述

7.5 筛选器结构体

(1).图一是筛选器结构体的成员。

(2).图二是筛选器结构体的初始化函数。

(3).在CAN_FxR1和CAN_FxR2寄存器中,结构体成员CAN_FilterIdHight,CAN_FilterIdLow,CAN_FilterMaskIdHight和,CAN_FilterMaskIdLow分别对应图四的红,黑,黄,绿。

(4).图五是剩下的结构体成员的参数设置。

图一
在这里插入图片描述
图二
在这里插入图片描述
图四
在这里插入图片描述

图五
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八.CAN的原理图和接线

这里我们的TJA1050是收发器,如果板子上面没有,需要自己买一个,这里我使用的是STM32f103的正点原子战舰板,需要将跳线帽PA11与CAN_RX,PA12与CAN_TX连接。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

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

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

相关文章

LangChain 30 ChatGPT LLM将字符串作为输入并返回字符串Chat Model将消息列表作为输入并返回消息

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

深度学习(八):bert理解之transformer

1.主要结构 transformer 是一种深度学习模型,主要用于处理序列数据,如自然语言处理任务。它在 2017 年由 Vaswani 等人在论文 “Attention is All You Need” 中提出。 Transformer 的主要特点是它完全放弃了传统的循环神经网络(RNN&#x…

智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.爬行动物算法4.实验参数设定5.算法结果6.…

PHP函数定义和分类

函数的含义和定义格式 在PHP中,允许程序员将常用的流程或者变量等组件组织成一个固定的格式实现特定功能,也就是说函数是具有特定功能特定格式的代码段。 函数的定义格式如下: function 函数名(参数1,参数2,参数n) {…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点,关于vue的路由守卫。也就是鉴权,不是所有的组件任何人都可以访问到的,需要权限,而根据权限…

Hadoop入门学习笔记——六、连接到Hive

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 六、连接到Hive6.1. 使用Hive的Shell客户端6.2. 使用Beel…

vue3(五)-基础入门之计算属性

一、计算属性 1.计算属性与普通方法的的区别: 计算属性在需要渲染数据时调用一次,而后将结果缓存起来。只有计算属性所依赖的数据发生改变时才会重新调用函数,否则每次渲染相同的数据都只会从缓存中读取。 普通方法在每次数据需要渲染时都会…

CGAL的网格简化

1、介绍 曲面网格简化是减少曲面网格中使用的面数,同时尽可能保持整体形状、体积和边界的过程。它是细分法的反面。 这里提出的算法可以使用称为边折叠的方法简化任何有向2流形曲面,具有任意数量的连接组件,有或没有边界(边界或孔…

为什么react call api in cDidMount

为什么react call api in cDM 首先,放到constructor或者cWillMount不是语法错误 参考1 参考2 根据上2个参考,总结为: 1、官网就是这么建议的: 2、17版本后的react 由于fiber的出现导致 cWM 会调用多次! cWM 方法已…

Redis数据一致解决方案

文章目录 前言技术积累查询缓存业务流程更新缓存业务流程 更新缓存问题解决方案写在最后 前言 当前的应用服务很多都有着高并发的业务场景,对于高并发的解决方案一般会用到缓存来降低数据库压力,并且还能够提高系统性能减少请求耗时,比如我们…

深度学习(七):bert理解之输入形式

传统的预训练方法存在一些问题,如单向语言模型的局限性和无法处理双向上下文的限制。为了解决这些问题,一种新的预训练方法随即被提出,即BERT(Bidirectional Encoder Representations from Transformers)。通过在大规模…

蓝牙技术在物联网中的应用

随着蓝牙技术的不断演进和发展,蓝牙已经从单一的传统蓝牙技术发展成集传统蓝牙。高速蓝牙和低耗能蓝牙于一体的综合技术,不同的应用标准更是超过40个越来越广的技术领域和越来越多的应用场景,使得目前的蓝牙技术成为包含传感器技术、识别技术…

【Spring Security】打造安全无忧的Web应用--使用篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Spring Security中的授权是…

Netty-2-数据编解码

解析编解码支持的原理 以编码为例,要将对象序列化成字节流,你可以使用MessageToByteEncoder或MessageToMessageEncoder类。 这两个类都继承自ChannelOutboundHandlerAdapter适配器类,用于进行数据的转换。 其中,对于MessageToMe…

基于 Webpack 插件体系的 Mock 服务

背景 在软件研发流程中,对于前后端分离的架构体系而言,为了能够更快速、高效的实现功能的开发,研发团队通常来说会在产品原型阶段对前后端联调的数据接口进行结构设计及约定,进而可以分别同步进行对应功能的实现,提升研…

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构,其中基本的矩阵乘法运算被卷积运算取代,专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…

kubernetes集群 应用实践 kafka部署

kubernetes集群 应用实践 kafka部署 零.1、环境说明 零.2、kafka架构说明 zookeeper在kafka集群中的作用 一、Broker注册 二、Topic注册 三、Topic Partition选主 四、生产者负载均衡 五、消费者负载均衡 一、持久化存储资源准备 1.1 创建共享目录 [rootnfsserver ~]# mkdir -…

锯齿云服务器租赁使用教程

首先登陆锯齿云账号 网盘上传数据集与代码 随后我们需要做的是将所需要的数据集与代码上传到网盘(也可以直接在租用服务器后将数据集与代码传到服务器的硬盘上,但这样做会消耗大量时间,造成资源浪费) 点击工作空间:…

谷粒商城-商品服务-新增商品功能开发(商品图片无法展示问题没有解决)

在网关配置路由 - id: member_routeuri: lb://gulimemberpredicates:- Path/api/gulimember/**filters:- RewritePath/api/(?<segment>.*),/$\{segment}并将所有逆向生成的工程调式出来 获取分类关联的品牌 例如&#xff1a;手机&#xff08;分类&#xff09;-> 品…

Python算法例26 落单的数Ⅳ

1. 问题描述 给定数组&#xff0c;除了一个数出现一次外&#xff0c;所有数都出现两次&#xff0c;并且所有出现两次的数都挨着&#xff0c;找出出现一次的数。 2. 问题示例 给出nums[3&#xff0c;3&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;5]&am…