协议

Firmata

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 11 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Firmata 协议基于用于与音乐设备通信的 MIDI 协议。

它也是与 Arduino 设备通信时使用最广泛的协议之一。

该驱动的构建目标是兼容 StandardFirmata Arduino Sketch,相关信息可参见此处(版本最后更新于 2017 年 8 月 17 日)。

支持的操作

名称值说明
write仅支持向数字地址写入。
subscribe数字地址和模拟地址均支持订阅。详见 note。

Go 和 Java 驱动均不支持读取;对开发板的操作是驱动与监视,而不是轮询。

订阅引脚时,这些引脚会被配置为读取引脚。向数字引脚写入时,这些引脚会被配置为输出引脚。但是,如果向已存在订阅的引脚写入,将会抛出异常。若要写入之前已订阅的引脚,必须先取消该引脚的所有订阅。

连接字符串

firmata:serial://{comm-port}[?{options}]
firmata:tcp://{ip-address}[?{options}]

serial 是默认的传输方式——即经典的 UART 上传输 Firmata 协议路径。tcp 面向 StandardFirmataWiFi / StandardFirmataEthernet 风格的板卡,并且在串口传输无法打开 socat 桥接的 PTY(例如在 macOS 上)时,也会作为回退方案使用。

连接字符串选项

Name

Type

Default Value

Required

Description

Name

Firmata

Code

firmata

Maven 依赖

<dependency>
  <groupId>org.apache.plc4x</groupId>
  <artifactId>plc4j-driver-firmata</artifactId>
  <version>1.0.0</version>
</dependency>

默认传输

serial

支持的传输方式

  • serial
  • tcp

配置选项:

request-timeout-ms

INT(整型)

10000

连接建立时,等待初始固件报告回复的最长时间(毫秒)。

传输配置选项:

serial

serial.baud-rate

整数(INT)

9600

波特率(比特每秒)

serial.data-bits

INT

8

数据位的数量(5、6、7 或 8)

serial.stop-bits

INT

1

停止位的数量(1 或 2)

serial.parity

STRING 类型

取值:none

校验位:none、odd、even、mark、space(不区分大小写)

serial.flow-control

STRING

none

流控制:none、rts-cts、xon-xoff(不区分大小写)

serial.read-timeout-ms

INT

1000

以毫秒为单位的读取超时时间。0 表示阻塞读取。

serial.write-timeout-ms

INT

1000

以毫秒为单位的写入超时时间。

serial.dtr

BOOLEAN

false

启用 DTR(数据终端就绪)信号

serial.rts

BOOLEAN

false

启用 RTS(请求发送)信号

serial.reuse-port

布尔

false

在多个传输实例之间复用底层串口。设为 true 时,使用相同端口的实例将共享一个连接。这对于多个逻辑连接共用一个串口的协议非常有用。共享端口的连接必须指向不同的单元 ID;Modbus RTU 响应不携带事务 ID,因此无法区分来自多个连接的同一单元的流量。

serial.interframe-delay

INT

0

消息间需要间隔的协议的帧间延迟(毫秒)。适用于共享端口和专用端口;间隔从最后一次写入或接收到的数据开始计算。

tcp

tcp.connect-timeout-ms

INT

5000

连接超时时间,单位为毫秒。

tcp.read-timeout-ms

INT

0

以毫秒为单位的套接字读取超时时间。0 表示不超时。

tcp.write-timeout-ms

INT

0

以毫秒为单位的套接字写入超时时间。0 表示不超时。

tcp.no-delay

BOOLEAN

true

启用 TCP_NODELAY(禁用 Nagle 算法)。

tcp.keep-alive

BOOLEAN

false

启用 SO_KEEPALIVE。

tcp.send-buffer-size

INT

81920

发送缓冲区大小(字节)。0 表示使用系统默认值。

tcp.receive-buffer-size

INT

81920

接收缓冲区大小(字节)。0 表示使用系统默认值。

tcp.local-address

STRING

要绑定的本地地址(可选)。若未设置,则使用默认值。

tcp.local-port

INT

0

要绑定的本地端口(可选)。0 表示使用临时端口。

标签地址

寻址功能在 Go 和 Java 中均有实现。两个驱动都不进行读取;主板只被驱动和监视,从不轮询。有关各实现的功能范围,请参阅 协议支持矩阵。

Firmata 地址不携带类型,因此在记法统一时方括号并未移动——而它们的含义也随之改变,却没有任何东西对其加以约束。3[4] 过去表示从引脚 3 开始的四个引脚;现在它表示一个引脚,即第五个。请将其改写为 3[0..3]。

通用格式

Firmata 地址总是以 digital: 或 analog: 前缀开头,用于指明下述两种地址形式中的哪一种适用。有关两者共有的 [{selection}] 部分,请参阅数组寻址。

Java 驱动将引脚编号本身限制为 3 位数(0-999,FirmataTag.ADDRESS_PATTERN,\d{1,3}),另外还单独将地址与选择部分的总长度限制为协议在线路上可表示的 256 个引脚(FirmataTag.PIN_COUNT)。Go 驱动移植的模式对引脚编号本身使用无边界的 \d+(plc4go/internal/firmata/TagHandler.go:38),因此 digital:1234 在 Go 侧可以解析,却被 Java 拒绝——有关此次重构,请参见 Java/Go 地址差异报告中的 firmata 条目。

二进制地址

数字地址的完整格式为:

digital:{start-address}[{selection}]:{special-config}

start-address 是一个普通整数。使用 special-config 可以将数字输入引脚配置为 INPUT 以外的其他模式;目前唯一支持的选项是 PULLUP,它会将 Arduino 的数字输入引脚配置为使用其内置上拉电阻。

[{selection}] 和 :{special-config} 这两部分都是可选的。

标准的 Arduino Uno 配备有 14 个数字输入引脚:0-13。

不过,在使用串行端口时(使用本驱动时始终如此),引脚 0 和 1 是串行端口的 RX 和 TX 引脚,无法使用。

模拟地址

模拟地址的完整格式为:

analog:{start-address}[{selection}]

start-address 是普通整数,而 [{selection}] 是可选的。

标准的 Arduino Uno 配备 6 个模拟输入:0-5。

数据类型

Firmata 地址不带类型后缀;类型由所使用的前缀隐含决定。数字地址始终为 BOOL(FirmataTagDigital.getPlcValueType());模拟地址始终为 INT(FirmataTagAnalog.getPlcValueType())。

示例

digital:2
digital:5
digital:8[0..3]:PULLUP
digital:0[0..255]
analog:0
analog:3
analog:0[0..2]

更多信息

评论

登录后参与评论

正在加载评论…