我遇到了一些技术问题......我正在尝试使用Firmata进行arduino但是超过nrf24,而不是使用串行接口。我已经测试了nRF24通信,它很好。我也测试过Firmata而不是Serial,它可以工作。
基础设备很简单“串行继电器”。如果Serial上有数据,请阅读并通过nRF24 network发送。如果有可从网络获得的数据,请阅读并通过Serial发送。
节点设备有点复杂。它有自定义Standard Firmata,我刚刚添加了写入和读取覆盖。
以这种方式读取loop
方法中的覆盖id:
while(Firmata.available())
Firmata.processInput();
// Handle network data and send it to Firmata process method
while(network.available()) {
RF24NetworkHeader header;
uint8_t data;
network.read(header, &data, sizeof(uint8_t));
Serial.print(data, DEC); Serial.print(" ");
Firmata.processInputOverride(data);
BlinkOnBoard(50);
}
currentMillis = millis();
Firmata processInputOverrride
几乎没有改变processInput
的方法,其中processInput
直接从FirmataSerial
读取数据,在此方法中,我们将数据传递给网络中的方法。经过测试,它应该可以正常工作。
Write方法以不同的方式重载。在Firmata.cpp
中,我添加了一个方法指针,可以将其设置为自定义方法,并用于使用该自定义方法发送数据。然后我在每个FirmataSerial.write()
调用后添加了自定义方法调用:
Firmata.h
...
size_t (*firmataSerialWriteOverride)(uint8_t);
...
void FirmataClass::printVersion(void) {
FirmataSerial.write(REPORT_VERSION);
FirmataSerial.write(FIRMATA_MAJOR_VERSION);
FirmataSerial.write(FIRMATA_MINOR_VERSION);
Firmata.firmataSerialWriteOverride(REPORT_VERSION);
Firmata.firmataSerialWriteOverride(FIRMATA_MAJOR_VERSION);
Firmata.firmataSerialWriteOverride(FIRMATA_MINOR_VERSION);
}
然后我将覆盖的写入方法设置为自定义方法,该方法只是将字节写入网络而不是Serial
。
size_t ssignal(uint8_t data) {
RF24NetworkHeader header(BaseDevice);
network.write(header, &data, sizeof(uint8_t));
}
void setup() {
...
Firmata.firmataSerialWriteOverride = ssignal;
...
}
一切似乎都运转良好,只是某些数据似乎是倒置的或其他东西。我正在使用sharpduino(C#)做一些简单的数字引脚切换。以下是输出的样子:(<来自BASE,>来自BASE)
> 208 0
> 209 0
...
> 223 0
> 249
< 4 2 249
and here communication stops...
最后一行反过来了。所以我很难,我只需要反转接收到的字节。它适用于第一个命令。但随后发生了一些事情,沟通再次停止。
> 208 0
> 209 0
...
> 223 0
> 249 // Report firmware version request
< 249 2 4
> 240 121 247 // 240 is sysex begin and 247 is systex end
< 240 121
< 101 0 67 0 0 1 69 0 118
< 117 0 115 0
< 0 70 0 105 0 116 0 111 0 109
< 0 97 0
< 0 109
< 116 0 97 0 247
> 240 107 247
那么这可能是什么问题?似乎与Firmata的沟通有效,但有些事情是不对的......
- 编辑 -
我解决了这个问题。问题是我在sysex回调中没有看到Serial.write()
次调用。现在已经解决了,我遇到了另一个问题......所有阶段都通过了(我猜)然后当我请求引脚状态时我没有得到Node的任何响应
...
< f0 6a 7f 7f 7f ... 7f 0 1 2 3 4 5 6 7 8 9 a b c d e f f7 // analog mapping
> f0 6d 0 f7 // sysex request pin 0 state and value
> f0 6d 1 f7
> f0 6d 2 f7
...
> f0 6d 45 f7
// And I wait for response...
没有回应。任何想法为什么会发生?节点正确接收所有消息,并且存在处理引脚状态的代码。