Firmata
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
支持的传输方式
serialtcp
配置选项:
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]更多信息
- 数组寻址 — 共享的
[{selection}]语法。
评论
登录后参与评论
KnowForge