无线红外系统中的Arduino通信



我有两个Arduinos,我想将它们放在无线系统中,将红外代码从房子一个房间的手持遥控器中继到位于另一个房间的机顶盒。 一个Arduino有一个IR解码器,它从手持遥控器解码密钥,并将其发送到另一个Arduino,用IR发射器停在盒子前面。 该系统部分工作正常。 当我从检测器(到我的PC)获取代码并将其手动(从我的PC)发送到发射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 ...一个

当我将实际遥控器指向检测器时,或者当我使用代码 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。写入将以相同的方式工作。

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

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

首先是免责声明:我已经好几年没有编写我的arduino了。

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

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

在接收端,我想我会使用 ReadBytesTil,因为这似乎旨在执行您想要的操作并构建一些错误检查(超时且仅 4 个字节)。

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

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

发射端的输出数据正确。在您的情况下,myNumber.UL = 0x61A0F00F。当执行代码"Serial.print(myNumber.UL,HEX);"时,print类实际上将字符序列发送为"6"1"A"0"F"0"0"F"。因此,在您的串行监视器中,ACII 数据为"61A0F00F",相应的十六进制数据为"36 31 41 30 46 30 30 46"。您对通过文本和二进制格式传输数据感到困惑。

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

最新更新