CoAP(Constrained Application Protocol,受限应用协议)是一种计算机协议,专门用于资源受限的物联网设备,具有轻量级、可靠传输和高效数据交换的特点,适用于资源受限的环境。 由于物联网设备的内存和计算能力有限,传统的 HTTP 协议在这些设备上显得过于庞大和复杂。因此,IETF 的 CoRE 工作组提出了基于 REST 架构的 CoAP 协议( RFC 7252)。 CoAP 协议有两个不同的层:消息负载和请求/响应层。消息层处理 UDP 和异步消息,而请求/响应层基于请求/响应消息来管理请求/响应交互。CoAP 消息模型是 CoAP 的最低层,处理端点之间的 UDP 交换消息。每个 CoAP 消息都有一个唯一的 ID,这有助于检测消息重复。CoAP 协议使用两种消息:确认消息和不可确认的消息。确认消息是可靠消息,客户端可以使用这种消息确保消息将到达服务器。而不可确认的消息则不需要服务器确认。 协议特点 CoAP 协议网络传输层由 TCP 改为 UDP,以适应资源受限设备的需要。 它基于 REST 架构,这意味着服务器上的资源地址与互联网中的 URL 格式类似。客户端可以使用类似于 HTTP 的 POST、GET、PUT 和 DELETE 方法来访问服务器,这使得对 HTTP 的请求进行了简化。 CoAP 采用二进制格式,相比之下,HTTP 是文本格式,因此 CoAP 更加紧凑,可以减少传输的数据量。 CoAP 协议轻量化,最小长度仅为 4B,相比之下,一个 HTTP 头部可能达到几十个字节。 CoAP 支持可靠传输、数据重传和块传输,确保数据可靠到达。 CoAP 还支持 IP 多播,这意味着可以同时向多个设备发送请求。 CoAP 采用非长连接通信,适用于低功耗物联网场景。这与 TCP 的机制类似,对方必须确认收到消息,以实现可靠的消息传输。 消息类型 CoAP 协议有 4 种消息类型:CON、NON、ACK、RST CON:需要被确认的请求,如果 CON 请求被发送,那么对方必须做出响应。 NON:不需要被确认的请求,如果 NON 请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。 ACK:应答消息,对应的是 CON 消息的应答。 RST:复位消息,可靠传输时候接收的消息不认识或错误时,不能回 ACK 消息,必须回 RST 消息。 消息格式 消息头 必备,固定 4 个 byte。 Ver:2 bit,版本信息,当前为 0x01。 T: 2 bit, 消息类型,包括 CON, NON, ACK, RST 这 4 种。 TKL:4 bit,token 长度, 当前支持 0 ~ 8 B 长度,其他长度保留将来扩展用。 Code:8 bit,分成前 3 bit(0 ~ 7)和后 5 bit(0 ~ 31),前 3 bit 代表类型。 0.00 Indicates an Empty message 0.01-0.31 Indicates a request 1.00-1.31 Reserved 2.00-5.31 Indicates a response. 6.00-7.31 Reserved Message ID:16 bit, 代表消息 MID,每个消息都有一个 ID ,重发的消息 MID 不变。在一次会话中 ID 总是保持不变。但在这个会话之后该 ID 会被回收利用。 token 可选,用于将响应与请求匹配。 token 值为 0 到 8 字节的序列。每个请求都带有一个客户端生成的 token, 服务器在任何结果响应中都必须对其进行回应。token 类似消息 ID,用以标记消息的唯一性。token 还是消息安全性的一个设置,使用全 8 字节的随机数,使伪造的报文无法获得验证通过。标记是 ID 的另一种表现。 option 可选,0 个或者多个。请求消息与回应消息都可以有零到多个 options。 主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述,比如是否用到代理服务器,目的主机的端口等。CoAP 选项类似于 HTTP 请求头,它包括 CoAP 消息本身,例如 CoAP 端口号,CoAP 主机和 CoAP 查询字符串等。 payload 可选。实际携带数据内容, 若有, 前面加 payload 标识符 “0xFF”,如果没有 payload 标识符,那么就代表这是一个 0 长度的 payload。如果存在 payload 标识符但其后跟随的是 0 长度的 payload,那么必须当作消息格式错误处理。 请求方法(requests) 0.01 GET 方法——用于获得某资源 0.02 POST 方法——用于创建某资源 0.03 PUT 方法——用于更新某资源 0.04 DELETE 方法——用于删除某资源 URI 一个 CoAP 资源可以被一个 URI(Uniform Resource Identifier,统一资源标识符)所描述,例如一个设备可以测量温度,那么这个温度传感器的 URI 被描述为:coap://machine.address/sensors/temperature CoAP 的 URL 和 HTTP 的有很相似的地方,开头是 “coap” 对应 “http” 或者 “coaps” 对应 “https”。coap 默认端口 UDP 5683,coaps 默认端口是 UDP 5684。默认端口号可以省略。 规则与 http 的 URL 是一样的,比如不区分大小写等。 注:URL(Uniform Resource Locator,统一资源定位器)是一种特定的 URI,这种 URI 还含有如何获取资源的信息(例如 http、coap 等)。 安全性 CoAP 的安全性是用 DTLS 加密实现的。DTLS 的实现需要的资源和带宽较多,如果是资源非常少的终端和极有限的带宽下可能会跑不起来。DTLS 仅仅在单播情况下适用。 通信过程 上面以 GET 流程为例子,有没有发现,其实跟 HTTP 相类似。 Client 发起请求,类型是 CON,0.01 代表 GET 请求,MID 是请求消息 ID,URI-Path:temperature 代表请求温度。例如: coap://example.com:5683/~sensors/temperature Server 收到请求后,就会返回应答 2.05, MID 保持不变,并且返回具体参数 payload 温度 22.3 C 双向收发 基于消息的双向通信(M2M),CoAP Client 与 CoAP Server 双方都可以独立向对方发送请求。双方可当 client 或者 server 角色。传统的 HTTP 协议是主机与 web 服务器之间是单向通信的(用 websocket 除外)。而 CoAP 系统中 CoAP Client 与CoAP Server 是可以双向通信,双方都可以主动向对方发送请求。这也是 CoAP 协议解决物联网场景问题的关键所在。 订阅与发布 MQTT 协议是基于订阅与发布模型的,CoAP 通过扩展协议方式也简单的实现了订阅与发布模型。 当一个客户端需要定期去查询服务器端某个资源的最新状态时,订阅与发布模型就非常有用,不用这个模型,客户端就要周期的不断发送请求到服务器端。 模型框架: 关键概念: 主题 Subject: 代表 CoAP 的某个资源 观察者 Observer:代表对某个 CoAP 资源感兴趣的客户端 登记 Registration: 观察者需要向服务器登记感兴趣的主题 通知 Notification:当观察者感兴趣的主题发生内容变化时,服务器主动通知到观察者 观察协议在 CoAP 基础协议上增加了 1 个 Observe option, 其值为整数,通过该 options 来实现订阅与发布模型管理 在 GET 请求消息里面: oberser value 为 0: 代表向服务器端订阅一个主题。 oberser value 为 1: 代表向服务器端移除一个已订阅主题。 在 notification 消息里面: oberser value 代表 主题发生变化时,检测到顺序,以便客户端可以知道状态变化的先后。 客户端向服务器端登记感兴趣的主题 /temperature 当 temperature 发生状态改变时,服务器端主动通知到客户端。 客户端根据 token,就可以与之前订阅主题关联起来,以此确定是哪个主题订阅的。 一个 CoAP Client 可以分次向 CoAP Server 订阅多个资源主题。 一个 CoAP Server 上的主题可以被多个观察者(CoAP Client)订阅。 这样就通过了 CoAP Server 实现了 CoAP Client 之间直接数据转发通信。 可以通过灵活设计服务器上的资源链接,来实现对某个主题的条件订阅(类似触发器或者阀值等)。 比如订阅主题是: coap://server/temperature/critical?above=42 当温度超过 42,CoAP Server 需要发送通...
包含 通信 标签的文章
LwIP 处理链路状态改变
文/告别年代 Email:byeyear@hotmail.com 基本流程 A. link up -> link down: 关闭 MAC 和 DMA; 调用 netif_set_link_down B. link down -> link up: 打开 MAC 和 DMA; 调用 netif_set_link_up C. 注意:当使用 RAW API 时,所有使用 RAW API 的代码(包括处理链路状态的代码)必须运行于同一线程环境。 代码分析 有四个函数和两个标志位和链路状态改变有关: A. netif_set_up 该函数设置 NETIF_FLAG_UP 标记,并在链路已 up 的情况下发送 arp 探测。 如果你的网络使用静态 IP,那么在 lwip 初始化时调用该函数; 如果你的网络使用 DHCP,那么 DHCP 成功后会帮你调用 netif_set_up。 B. netif_set_down 除非你需要关闭网络,否则一般不需要主动调用该函数。 C. netif_set_link_up 该函数设置 NETIF_FLAG_LINK_UP 标记,启动 DHCP 和 AutoIP,并在 NETIF_FLAG_UP 标记有效的情况下发送 arp 探测。 当链路从 down 变化为 up 时调用该函数。 注意:初始化时如果链路有效,low_level_init 将直接设置 NETIF_FLAG_LINK_UP,而不调用 netif_set_link_up 函数,避免在 lwip 没有完全初始化好时启动 DHCP。 D. netif_set_link_down 在链路从 up 变为 down 时调用该函数。 E. NETIF_FLAG_UP和NETIF_FLAG_LINK_UP 前者表示 lwip 协议栈已经就绪(已得到合法 IP 地址,且协议栈已准备好收发数据包);后者表示链路层有效。 或者说,一个是软件(协议栈)就绪标志,一个是硬件(链路层)就绪标志。 F. 参考 lwip 代码中的 netif.h 文件对这两个标记的详细说明。 网上很多 port 代码不管是否使用 DHCP 都在 lwip 初始化时设置 NETIF_FLAG_UP,这是不正确的。 NETIF_FLAG_UP 必须在获得有效 IP 地址后才能置位,以保证顺利发送 ARP 探测。 情景分析 A. 静态 IP,初始化时链路有效 这是最简情况。驱动层会看到 Link 有效,并直接设置 NETIF_FLAG_LINK_UP。 随后 lwip 初始化过程中调用 netif_set_up,该函数设置 NETIF_FLAG_UP,并发送 arp 探测。 B. 静态 IP,初始化时链路无效 驱动层不会设置 NETIF_FLAG_LINK_UP。 lwip 初始化过程会调用 netif_set_up,该函数看到没有 link,除了设置标记外不会做任何事。 当链路变为有效后,驱动层调用 netif_set_link_up,发送 arp 探测。 C. 动态 IP,初始化时链路有效 驱动层直接设置 NETIF_FLAG_LINK_UP。 lwip 初始化过程中调用 dhcp_start,启动 DHCP 过程。 但 lwip 初始化过程不会调用 netif_set_up,因为还没有获得有效IP地址。 获得有效 IP 后,lwip 会帮我们调用 netif_set_up,发送 arp 探测。 D. 动态 IP,初始化时链路无效 驱动层不会设置 NETIF_FLAG_LINK_UP。 lwip 初始化过程中仍然会调用 dhcp_start。对 dhcp_start 的调用是必须的,因为 dhcp 过程需要的资源将在该函数中分配。 等到链路有效后驱动层调用 netif_set_link_up,该函数会启动 DHCP 过程。 获得有效 IP 后,lwip 会帮我们调用 netif_set_up,发送 arp 探测。 E. 静态 IP,链路断开后重建 链路断开时 netif_set_link_down,重建后 netif_set_link_up 发送 arp 探测。 NETIF_FLAG_UP 在设置后就一直有效。 F. 动态 IP,链路断开后重建 链路重建后 netif_set_link_up 重新启动 DHCP 过程,该过程会清除 NETIF_FLAG_UP 标记。 DHCP 完成后 lwip 自动调用 netif_set_up 重新置位该标记并发起 arp 探测。 总结 使用静态 IP low_level_init 根据当前链路状态设置或不设置 NETIF_FLAG_LINK_UP; lwip 初始化时调用 netif_set_up; 链路状态改变时调用 netif_set_link_up/netif_set_link_down。 使用动态 IP low_level_init 根据当前链路状态设置或不设置 NETIF_FLAG_LINK_UP; lwip 初始化时调用 dhcp_start; 链路状态改变时调用 netif_set_link_up/netif_set_link_down; 不要在使用动态IP时直接调用 netif_set_up,而是由lwip协议栈代码在成功获得 IP 后为你调用这个函...
MAC 与 PHY 组成原理的简单分析
1. general 下图是网口结构简图。网口由 CPU、MAC 和 PHY 三部分组成。DMA 控制器通常属于 CPU 的一部分,用虚线放在这里是为了表示 DMA 控制器可能会参与到网口数据传输中。 对于上述的三部分,并不一定都是独立的芯片,根据组合形式,可分为下列几种类型: 方案一:CPU 集成 MAC 与 PHY; 方案二:CPU 集成 MAC,PHY 采用独立芯片; 方案三:CPU 不集成 MAC 与 PHY,MAC 与 PHY 采用集成芯片; 本例中选用方案二做进一步说明,因为 CPU 总线接口很常见,通常都会做成可以像访问内存一样去访问,没必要拿出来说,而 MAC 与 PHY 之间的 MII 接口则需要多做些说明。 下图是采用方案二的网口结构图。虚框表示 CPU,MAC 集成在 CPU 中。PHY 芯片通过 MII 接口与 CPU 上的 MAC 连接。 在软件上对网口的操作通常分为下面几步: 1)为数据收发分配内存; 2)初始化 MAC 寄存器; 3)初始化 PHY 寄存器(通过 MIIM); 4)启动收发; 2. MII MII 接口是 MAC 与 PHY 连接的标准接口。因为各厂家采用了同样的接口,用户可以根据所需的性能、价格,采用不同型号,甚至不同公司的 PHY 芯片。 需要发送的数据通过 MII 接口中的收发两组总线实现。而对 PHY 芯片寄存器的配置信息,则通过 MII 总的一组串口总线实现,即 MIIM(MII Management)。 下表列出了 MII 总线中主要的一些引脚 PIN Name Direction Description TXD[0:3] MAC to PHY Transmit Data TXEN MAC to PHY Transmit Enable TXCLK MAC to PHY Transmit Clock RXD[0:3] PHY to MAC Receive Data RXEN PHY to MAC Receive Enable RXCLK PHY to MAC Receive Clock MDC MAC to PHY Management Data Clock MDIO Bidirection Management Data I/O MIIM 只有两个线,时钟信号 MDC 与数据线 MDIO。读写命令均由 MAC 发起,PHY 不能通过 MIIM 主动向 MAC 发送信息。由于 MIIM 只能有 MAC 发起,我们可以操作的也就只有 MAC 上的寄存器。 3. DMA 收发数据总是间费时费力的事,尤其对于网络设备来说更是如此。CPU 做这些事情显然不合适。既然是数据搬移,最简单的办法当然是让 DMA 来做。毕竟专业的才是最好的。 这样 CPU 要做的事情就简单了。只需要告诉 DMA 起始地址与长度,剩下的事情就会自动完成。 通常在 MAC 中会有一组寄存器专门用户记录数据地址,tbase 与 rbase,CPU 按 MAC 要的格式把数据放好后,启动 MAC 的数据发送就可以了。启动过程常会用到寄存器 tstate。 4. MAC CPU 上有两组寄存器用与 MAC。一组用户数据的收发,对应上面的 DMA;一组用户 MIIM,用户对 PHY 进行配置。 两组寄存器由于都在 CPU 上,配置方式与其他 CPU 上寄存器一样,直接读写即可。 数据的转发通过 DMA 完成。 5. PHY 该芯片是一个 10M/100M Ethernet 网口芯片 PHY 芯片有一组寄存器用户保存配置,并更新状态。CPU 不能直接访问这组寄存器,只能通过 MAC 上的 MIIM 寄存器组实现间接访问。 同时 PHY 芯片负责完成 MII 总线的数据与 Media Interface 上数据的转发。该转发根据寄存器配置自动完成,不需要外接干预。 作者:fireaxe_hq@hotmail.c...
RFC 1662: PPP in HDLC-like Framing
点对点协议(PPP)提供了一种标准方法,用于在点对点链路上传输多协议数据报。 本文档描述了使用类似 HDLC 的帧结构对 PPP 封装的数据包进行封装。 帧格式: +----------+----------+----------+ | Flag | Address | Control | | 01111110 | 11111111 | 00000011 | +----------+----------+----------+ +----------+-------------+---------+ | Protocol | Information | Padding | | 8/16 bits| * | * | +----------+-------------+---------+ +----------+----------+----------------- | FCS | Flag | Inter-frame Fill |16/32 bits| 01111110 | or next Address +----------+----------+----------------- 传输前需要转义,转义符为 7d(计算完 CRC 后再转义) 头尾的 7e 不需要转义,其他的 7e、7d、小于 0x20(空格)的字节都需要转义。 字节 c 转义后为:0x7d (c xor 0x20),例如: 0x7e is encoded as 0x7d, 0x5e. (Flag Sequence) 0x7d is encoded as 0x7d, 0x5d. (Control Escape) 0x03 is encoded as 0x7d, 0x23. (ETX) 协议文本: RFC 1662_ PPP in HDLC-like Framing.p...
YMODEM 协议
YMODEM 协议是一种高效的文件传输协议,通常用于调制解调器之间的数据传输。YMODEM 协议的产生是为了解决 XMODEM 协议存在的一些问题。相较于 XMODEM,YMODEM 协议在数据传输效率和稳定性上有所改进。 YMODEM 协议的主要特点包括: 数据包大小:YMODEM 协议支持以 1024 字节(或 1K)的块进行数据传输,这比 XMODEM 协议通常使用的 128 字节块要大得多,从而提高了传输效率。 错误纠正:YMODEM 协议采用循环冗余校验(CRC16)进行错误检测,并在发现错误时请求重发数据块,以确保数据的正确传输。 批处理模式:YMODEM 协议支持批处理模式,允许使用单个命令传输多个文件,这在传输大量文件时非常有用。 文件名传输:在发送文件数据之前,YMODEM 协议会先发送文件名和文件大小等信息,以便接收方能够正确地保存文件。 YMODEM 协议中定义了几种关键字: 关键字 值 说明 SOH 0x01 协议头(128 bytes 类型) STX 0x02 协议头(1K 类型) EOT 0x04 传输结束 ACK 0x06 接收响应 NAK 0x15 失败响应 CAN 0x18 取消传输 C 0x43 开启文件传输 CPMEOF 0x1A 数据补齐填充字符(^Z,控制字符 Z) YMODEM 传输协议: SOH [index] [index2] [128 bytes data] [CRC-hi] [CRC-lo] STX [index] [index2] [1024 bytes data] [CRC-hi] [CRC-lo] index 是帧序号,0 ~ 255,传输时递增。 index2 是index取反,也即:index2 = ~index = 255 - index crc16 校验数据域 [data] 在 YMODEM 协议的基本流程中,发送方会先发送一个起始帧,其中包含文件名和文件大小等信息。接收方在收到起始帧后,会发送一个确认信号(ACK)。然后,发送方开始以 1024 字节的块发送文件数据,每发送一个数据块后都会等待接收方的 ACK 信号。如果接收方成功接收到数据块并通过 CRC 校验,则发送 ACK 信号;否则,发送否定确认信号(NAK)请求重发。当文件传输完成后,发送方会发送一个结束帧(EOT),接收方在收到结束帧后会再次发送 ACK 信号进行确认。 交互序列图: 传输时先发送一个 128 字节的文件信息块,将文件名和文件大小发送给设备。 SOH 00 FF [filename] [filesize] [NULL] CRCH CRCL [filename] 文件名,如文件名 foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00 [filesize] 文件大小,例如大小为 400 bytes,它在数据帧的存放格式为:34 30 30 00,即 “400”。(不同的软件可能有所却别) [NULL] 表示剩下的字节都用 00 填充 传输文件内容时,如果文件数据的最后剩余的数据在 128 ~ 1024 之间,则还是使用 STX 的 1024 字节传输;如果文件大小小于等于 128 字节,则选择 SOH 数据帧用 128 字节来传输数据。若数据不足一帧,用 CPMEOF 来填充。 附: XMODEM/YMODEM 协议: http://pauillac.inria.fr/~doligez/zmodem/ymodem.txt ZMODEM 协议: http://gallium.inria.fr/~doligez/zmodem/zmodem.t...
Modbus 通信协议
Modbus 是一个请求/应答协议,是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。 Modbus 采用主站询问或命令的方式通信,从站不能主动上报。只能通过增大主站轮询频率的办法增强实时性。 Modbus 的传送有 3 种模式:Modbus ASCII、Modbus RTU、Modbus TCP。 Modbus ASCII 用 Hex 字符表示值,例如要传送一个字节值 0x2A 则发送两个字节字符 "2A"。 帧格式: Modbus RTU 帧格式: CRC 校验是 16 位的,低字节在前。 不同类型帧的数据域定义是不同的,几种情况: 读寄存器时主机的数据域: 寄存器地址、寄存器个数等数值按高字节在前方式传输。 读寄存器时从机正确应答的数据域: 寄存器是 16 位的,所以 数据字节数 = 寄存器个数 * 2 从机异常应答的数据域: 异常应答的功能码的最高位为1。 Modbus TCP 由于 TCP 是可靠传输,所以相比 RTU 格式没有 CRC 校验域。 帧格式: 传输标志:请求和响应传输过程中序列号 协议标志:默认为 0 长度:值为长度域后所有内容的字节数,同样地也是大端模式传输 单元标志:串行链路或其它总线上连接的远程从站识别码,通常是 0 Modbus RTU 与 Modbus TCP 的区...
STM32 CAN 总线通信
CAN 是控制器局域网络 (Controller Area Network, CAN) 的简称,是由以研发和生产汽车电子产品著称的德国 BOSCH(没错,就是那个卖电动工具的博世)公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。 CAN 采用多主工作方式,节点之间不分主从,但节点之间有优先级之分,通信方式灵活,可实现点对点、一点对多点及广播方式传输数据,无需调度。CAN 采用的是非破坏性总线仲裁技术,按优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。CAN 采用短帧结构传输,每帧有效字节为 8 个,传输时间短,受干扰的概率低。而且每帧信息都有 CRC 校验和其它检错措施,保证数据出错率极低。当节点严重错误时,具有自动关闭功能,使总线上其它节点不受影响,所以 CAN 是所有总线中最为可靠的。CAN 总线可采用双绞线、同轴电缆或光纤作为传输介质。它的直接通信距离最远可达 10km,通信速率最高达 1M bps(通信距离为 40m 时),总线上可挂设备数主要取决于总线驱动电路,最多可达 110 个。但 CAN 不能用于防爆区。 CAN网拓扑结构 CAN 是半双工的。收发数据要分时进行。不管 CAN 网络上挂多少设备,在同一时刻只能有 1 个发送数据。如果有多个需要同时发送则只有优先级别高的先发送,其它等待。控制器有收发两个接口,但是收发器的两个接口变成了 High 和 Low。CAN 总线式两线制的。在这点上可以与 Uart 控制器与 RS-485 收发器来类比。 CAN 协议目前有 2.0A 和 2.0B。CAN 2.0A 是 CAN 协议的 PART A 部分,此部分定义了 11bit 的标识区 。 CAN 2.0B 是 CAN 协议的扩展部分,也叫 PART B,定义了 29bit 的标识区,设计上与 CAN2.0A 兼容。通常支持 2.0B 协议的芯片同时也支持 2.0A。 STM32 单片机的 CAN 控制器接口有收、发两个口,互联型有两个 CAN 控制器。两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是他们共用 28 个滤波器。通过 CAN_FMR 寄存器的设置,可以设置滤波器的分配方式。 STM32 的过滤器组最多有 28 个(互联型),但是 STM32F103ZET6 只有 14个(增强型),每个过滤器组由 2 个 32 为寄存器,CAN_FxR1 和 CAN_FxR2 组成。过滤器有两种工作模式:屏蔽位模式和标识符列表模式。工作在屏蔽位模式时 CAN_FxR2 为 1 的位指示了接收到的标识位必须与 CAN_FxR1 相对应的位的 0 或 1 完全一致才能通过过滤器。如果 CAN_FxR2 全为 0 也就意味着不进行任何过滤。工作在标识符列表模式时 CAN_FxR1 和 CAN_FxR2 互不相干,CAN_FxR2 也是一个像 CAN_FxR1 的寄存器,当接收到的标识符与 CAN_FxR1 或 CAN_FxR2 完全匹配时才能通过过滤器。 STM32 提供了两种测试模式,环回模式和静默模式。环回测试模式不需要短接外部的两个脚,它是在内部环回的...
RS-232 接口标准
RS-232 是美国电子工业联盟 EIA(Electronic Industry Association)制定的串行数据通信的物理接口标准,原始编号全称是 EIA-RS-232(简称 RS232, 232),目前的版本是 C(RS-232-C)。 标准的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。该标准规定采用一个 25 脚的 DB-25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来 IBM 的 PC 机将 RS-232 简化成了 DB-9 连接器,从而成为事实标准。而现在通常只使用 RXD、TXD、GND 三条...