2

我有两个 Arduino,我想将它们放入无线系统中,以将 IR 代码从房子的一个房间的手持遥控器中继到另一个房间的机顶盒。一个 Arduino 有一个 IR 解码器,它从手持遥控器解码密钥,然后将其发送到另一个 Arduino,该 Arduino 用一个 IR 发射器停在盒子前面。该系统部分工作正常。当我从检测器(到我的电脑)获取代码并手动(从我的电脑)发送到发射的 Arduino 时,它会正确控制盒子。但是当我尝试直接在 Arduinos 之间无线发送代码时,它就不太正常了。命令似乎没有正确中继,并且发出的 Arduino 无法控制 bx。

这是解码 Arduino 代码的样子。"myNumber" 持有 4 字节密钥:

myNumber.UL = results->value;
Serial.write(&myNumber.B,4);

当解码器检测到 IR 模式时,无论我使用发射器还是按下遥控器上的开/关键,它都会将以下内容发送到串行端口。有问题的密钥是 61A0F00F(电源开/关):

     Hex Field      ASCII        

0000 0F F0 A0 61 ...a

当我将实际遥控器指向检测器时,或者当我使用代码 61A0F00F 驱动我的发射器时,解码器会发出相同的响应。所以它无法区分实际遥控器和 Arduino 驱动的发射器之间的区别。问题是系统发射端的 Arduino 无法正确理解此输出。

这是发射代码的样子:

  void loop() {
  int x = 0;
  while (x < 4) {
    if (Serial.available()) myNumber.B[x++] = Serial.read();
}    
Serial.print(myNumber.UL, HEX);

if (x==3) irsend.sendNEC(myNumber.UL, 32);  //drive IR emitter with NEC code
delay(10000);

串行输出如下所示:

     HEX field                 ASCII Field

0000 36 31 41 30 46 30 30 46 61A0F00F

当我手动输入这个十六进制代码时,即通过CoolTerm,反转(所以0FF0A061)机顶盒响应(通过打开)。当我无线连接 Arduinos 时,它没有。

任何人都可以看到上面的通信有什么问题吗?十六进制字段中的数字看起来不太正确,解码器的十六进制字段看起来像十六进制,但发射器的十六进制字段看起来像 ASCII?那么发射器是否需要一个 ASCII 数字但得到的是十六进制?我会认为 Serial.read 和 Serial。write 会以同样的方式工作。

这非常令人沮丧,因为该系统似乎几乎,几乎可以工作,但不完全!

任何帮助/见解将不胜感激。

4

2 回答 2

0

First a disclaimer: I haven't coded my arduino for several years.

At first glance it would appear you are being bitten by a conversion bug. I see a lot of conversions from byte to long etc. The key here would be to break things down to their simplest level and verify each level works.

First off I would verify the number of bytes being sent by checking the return value from Serial.write is indeed 4. Something as simple as flashing an led if Serial.write returns 4.

On the receiving end I think I would use ReadBytesUntil as this seems to be designed to do what you want and builds in some error checking (time outs and only 4 bytes).

I hope this helps. If not follow the golden rule: when in doubt - post more code!

于 2012-05-24T18:14:03.893 回答
0

希望迟到的回复有所帮助。

发射端输出数据正确。在您的情况下,myNumber.UL = 0x61A0F00F。执行代码“Serial.print(myNumber.UL, HEX);”时,打印类实际发出的字符序列为 '6''1''A''0''F''0''0'' F'。所以在你的串口监视器中,ACII 数据是“61A0F00F”,对应的 HEX 数据是“36 31 41 30 46 30 30 46”。您对通过文本和二进制格式传输数据感到困惑。

您的代码的问题在于“if (x==3) irsend.sendNEC(myNumber.UL, 32);”行。接收到四个字节的数据后,x 是 4 而不是 3。将条件 x==3 更改为 x==4 可以解决您的问题。

于 2012-06-10T08:53:51.217 回答