无线IR系统中的Arduino通信

时间:2012-05-24 12:19:33

标签: arduino wireless infrared

我想把两个Arduinos放在一个无线系统中,用于将房屋的一个房间里的手持遥控器的IR代码转发到位于另一个房间的机顶盒。一个Arduino有一个IR解码器,它从手持遥控器解码钥匙,并将其发送到停放在盒子前面的另一个带有红外发射器的Arduino。该系统部分工作正常。当我从探测器(到我的电脑)获取代码并手动(从我的电脑)发送到发射的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。写会以同样的方式工作。

这非常令人沮丧,因为看起来系统差不多,几乎可以工作,但不是很好!

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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

来自发射端的输出数据是正确的。在您的情况下,myNumber.UL = 0x61A0F00F。当执行代码“Serial.print(myNumber.UL,HEX);”时,打印类实际上将char序列发送为'6''1''''''''''''''''''' 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可以解决您的问题。

相关问题