【问题标题】:Arduino communication in wireless IR system无线红外系统中的 Arduino 通信
【发布时间】:2012-05-31 00:43:05
【问题描述】:

我有两个 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 会以同样的方式工作。

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

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

【问题讨论】:

    标签: arduino wireless infrared


    【解决方案1】:

    首先声明:我已经好几年没有编写过我的 arduino 代码了。

    乍一看,您似乎被转换错误所困扰。我看到很多从字节到长等的转换。这里的关键是将事情分解到最简单的级别并验证每个级别都有效。

    首先,我将通过检查 Serial.write 的返回值来验证发送的字节数确实是 4。如果 Serial.write 返回 4,就像闪烁 LED 一样简单。

    在接收端,我想我会使用ReadBytesUntil,因为这似乎是为了做你想做的事情,并且内置了一些错误检查(超时并且只有 4 个字节)。

    我希望这会有所帮助。如果不遵循黄金法则:如有疑问 - 发布更多代码!

    【讨论】:

      【解决方案2】:

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

      发射端的输出数据正确。在您的情况下,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 可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多