分类 嵌入式开发 下的文章

CoAP 通信协议

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 需要发送通...

将 Arduino IDE 的缩进改为 4 空格

以 Arduino IDE v2.3 为例,需要修改两个地方。 1、使 IDE 在编辑时 Tab 键缩进 4 个空格: 修改 C:\Users\<你的用户名>\.arduinoIDE\settings.json,增加 "editor.tabSize": 4 2、使自动格式化(Ctrl + T)缩进 4 个空格: 在 C:\Users\<你的用户名>\.arduinoIDE\ 创建文件 .clang-format,添加内容:IndentWidth:...

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 后为你调用这个函...

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...

关于 gcc-arm-none-eabi 浮点数

Windows (mingw-w64-i686) hosted cross toolchains AArch32 bare-metal target (arm-none-eabi) https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads 使用 arm-none-eabi-gcc 交叉编译链只能编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application) 有关浮点数: 查看 gcc 的默认 define: $ ./arm-none-eabi-gcc -x c - -E -dM </dev/null|grep SOFT #define __SOFTFP__ 1 -mfloat-abi=name Specifies which floating-point ABI to use. Permissible values are: ‘soft’,‘softfp’ and ‘hard’. ABI,application binary interface (ABI),应用程序 二进制接口。 softfp 与 hard 都使用硬件 FPU 指令,但使用软件接口。hard 则使用硬件接口。所以 soft 与 softfp 兼容,他们与 hard 不兼容。 当 -mfloat-abi=soft 时 会定义 #define __SOFTFP__ 1 当为 softfp 或 hard 时,不会定义 __SOFTFP__ 而 __VFP_FP__ 总是定义的(#define __VFP_FP__ 1),即使 -mfloat-abi=soft 时。 源码头文件有这样的定义: #elif defined ( __GNUC__ ) #if defined (__VFP_FP__) && !defined(__SOFTFP__) #if (__FPU_PRESENT == 1) #define __FPU_USED 1 #else #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #define __FPU_USED 0 #endif #else #define __FPU_USED 0 #endif 也就是说,在定义了 softfp 或 hard 时,当 __FPU_PRESENT 为 1 时,会定义 #define __FPU_USED 1,也就是要启用 FPU。__FPU_PRESENT 需要用户自己定义。 当使用 hard 或者 softfp 时,必须同时指定 FPU: -mfpu= option supports the following FPU types: vfp, vfpv3, vfpv3-fp16, vfpv3-d16, vfpv3-d16-fp16, vfpv3xd, vfpv3xd-fp16, neon, neon-fp16, vfpv4, vfpv4-d16, fpv4-sp-d16, neon-vfpv4, fp-armv8, neon-fp-armv8, and crypto-neon-fp-armv8. cortex-m4 选择:fpv4-sp-d...

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 的区...

Arduino 简介

Arduino(读音:Arr du ee no,大约是:阿杜- 依no)是一个源于意大利的开源电子原型平台,自 2005 年诞生以来,已经在全球范围内引领了一场硬件创新的革命。以其易用性、灵活性和开源的特性,Arduino 为艺术家、设计师、研究人员和业余爱好者提供了一个全新的工具,以实现他们的创意。 Arduino 的起源可以追溯到 2003 年,当时两名意大利教师 Massimo Banzi 和 David Cuartielles 为了给他们的学生们提供一个更容易实现交互项目的工具,开始设计一种简单的、价格适中的、易于使用的硬件平台。这个平台就是 Arduino 的雏形。 最初的 Arduino 板是由 Banzi、Cuartielles 以及西班牙籍学者 Javier Zagal 在他们的家乡 Ivrea 设计出来的,并在 2005 年正式发布。据说其名来源于 Banzi 经常光顾的一家酒吧的名字”di Re Arduino“。 随着时间的推移,Arduino 不断发展,推出了多种型号,如 Arduino Uno、Arduino Mega、Arduino Mini 等,适应了各种不同的应用场景。 目前的应用概况: 教育领域:在教育领域,Arduino 已成为许多学校和机构的必备工具。学生们使用 Arduino 进行各种实验,学习电子、编程和机器人技术,提高他们的创新能力。 艺术和设计领域:艺术家和设计师们利用 Arduino 创造出各种交互式装置和艺术作品,如动态雕塑、交互式服装等。 物联网:Arduino 在物联网领域的应用广泛,例如智能家居系统、环境监测站等。通过与传感器和其他设备的连接,Arduino 可以实现远程控制和数据收集。 机器人:Arduino 是许多机器人项目的核心组件,从简单的玩具机器人到复杂的自主导航机器人都可以看到 Arduino 的身影。 工业自动化:在工业自动化领域,Arduino 被用于控制和监测生产线上的设备和机器。例如,它可以用来控制机械臂的运动或监测温度和湿度等环境参数。 嵌入式系统开发:虽然 Arduino 主要用于快速原型制作,但它也可以作为嵌入式系统的开发平台。通过使用 Arduino,开发人员可以快速构建和测试嵌入式系统的硬件和软件。 健康和医疗设备:在健康和医疗设备领域,Arduino 可以用于开发各种可穿戴设备、健康监测设备和医疗诊断工具等。例如,通过使用 Arduino 和传感器,可以开发出用于监测心率、血压或血糖水平的设备。 娱乐产业:在娱乐产业中,Arduino 也被广泛应用于各种项目,如灯光秀、音乐设备和游戏控制器等。 从教育到工业,从艺术到娱乐,Arduino 的影响力无处不在。它不仅降低了硬件开发的门槛,让更多的人能够参与到创新的实践中来,同时也推动了开源硬件和物联网的发展。未来,随着技术的进步和应用场景的不断拓展,Arduino 将会在更多领域发挥其巨大的潜...

Arduino 硬件介绍

Arduino 是一款开源的电子原型平台,包括各种型号的 Arduino 板和相应的开发环境软件。Arduino 板具有简单易用的特点,能够读写数字或模拟输入/输出引脚、使用 USB 接口进行通信、通过编程控制各种电子设备和传感器等。 以下是 Arduino 的一些主要硬件特性: 处理器:Arduino 板搭载了各种型号的微控制器,如 ATmega328(在 Arduino Uno 上)或 ATmega2560(在 Arduino Mega 上)。这些微控制器是 Arduino 板的核心,负责执行用户上传的程序。当然了还有很多衍生的板子搭载了其他厂商的 MCU,比如 STM32 等。 数字 I/O 引脚:Arduino 板具有多个数字输入/输出引脚,这些引脚可以读取或写入数字信号,用于控制 LED、电机等设备或读取按钮、开关等输入信号。 模拟输入引脚:一些 Arduino 板还具有模拟输入引脚,可以读取模拟信号,如温度传感器的输出电压。这些引脚通常具有 10 位的分辨率,即可以读取 0 到 1023 之间的值。 USB 接口:大多数 Arduino 板都具有 USB 接口,用于与计算机进行通信和供电。通过 USB 接口,用户可以上传程序到 Arduino 板,也可以从 Arduino 板读取数据。 电源和复位引脚:Arduino 板还具有电源和复位引脚,用于给板子供电和在需要时复位微控制器。 扩展接口:一些 Arduino 板还具有扩展接口,如 ICSP 头或 SPI/I2C 接口,可以用于连接其他扩展板或模块。 Arduino 板的尺寸和形状各异,以适应不同的应用场景。例如,Arduino Uno 是最常见的型号之一,具有标准的 USB 接口和足够的 I/O 引脚,适合大多数初学者和项目。而 Arduino Mega 则具有更多的 I/O 引脚和更大的内存,适合需要更多控制和数据处理能力的项目。 除了标准的 Arduino 板外,还有许多其他型号和变种可供选择,如 Arduino Leonardo、Arduino Micro 等。这些板子具有不同的处理器、引脚配置和功能特性,以满足不同的需求和应用场...

Arduino 编程语言介绍

Arduino 使用的编程语言是建立在 C/C++ 基础上的。虽然 C++ 兼容 C 语言,但它们是两种语言,具有不同的特性。C 是一种面向过程的编程语言,而 C++ 则引入了面向对象的概念。 Arduino 语言实际上是一套基于 C/C++ 的嵌入式设备开发框架,它提供了丰富的库函数和应用程序编程接口(API),以简化硬件设备的驱动和编程。这些 API 是对底层单片机支持库的二次封装,隐藏了复杂的底层细节,使得不熟悉硬件的用户也能轻松上手。所以说 Arduino 使用的 C++ 也只是标准 C++ 的一个子集,不包括所有的 C++ 标准库,因为这些库可能会占用太多的内存或处理器时间。例如,它不支持类继承和模板。但是,它仍然提供了足够的功能来编写复杂的程序,并且可以与其他 C++ 代码进行交互。 在 Arduino 编程中,常用的关键字包括 if、else、for、switch、case、while 等,这些关键字用于实现条件选择、循环、分支等控制结构。此外,Arduino 还引入了一些特殊的函数和宏定义,如 pinMode()、digitalWrite()、analogRead() 等,用于配置引脚模式、读写数字信号和模拟信号等操作。 Arduino 编程的一个显著特点是其清晰明了的 API 和简化的语法。通过调用相应的库函数和 API,用户可以轻松地控制硬件设备的各种功能,如 LED 闪烁、传感器读取、电机控制等。这种简化的编程方式降低了学习难度,使得更多人能够参与到硬件开发的领域中来。 总结来说,Arduino 编程语言是一种基于 C/C++ 的嵌入式设备开发语言,通过提供丰富的库函数和 API,简化了硬件设备的驱动和编程过程。它使得不熟悉硬件的用户也能轻松上手,并且广泛应用于教育、艺术、物联网等领...