我有两个Arduinos,我想把它们放在一个无线系统中,将一个红外代码从一个房间的手持遥控器转发到另一个房间的机顶盒。一个Arduino有一个红外解码器,它从手持遥控器解码钥匙,并将其发送到停在盒子前面的另一个带有红外发射器的Arduino。从某种程度上讲,该系统运行良好。当我从检测器(到我的PC)获得代码并手动(从我的PC)将其发送到正在发射的Arduino时,它可以正确地控制盒子。但是,当我尝试在Arduinos之间直接无线发送代码时,它并不能很好地工作。命令似乎没有正确传递,发射的Arduino无法控制bx。
以下是解码Arduino代码的样子。"myNumber“包含4个字节的密钥:
myNumber.UL = results->value;
Serial.write(&myNumber.B,4);当解码器检测到IR模式时,无论我是使用发射器还是按下遥控器上的on/off键,解码器都会将以下内容发送到串行端口。有问题的密钥是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 Field0000 36 31 41 30 46 30 46 61A0F00F
当我手动输入这个十六进制代码时,即通过CoolTerm反转(SO0F0A061),机顶盒就会响应(打开)。当我无线链接Arduinos时,它不起作用。
有没有人能看到上面的交流出了什么问题?十六进制字段中的数字看起来不太正确,来自解码器的十六进制字段看起来确实像十六进制,但是来自发射器的十六进制字段看起来像ASCII?那么发射器期望的是一个ASCII数字,而不是十六进制吗?我本以为Serial.read和串行。write的工作方式是一样的。
这是非常令人沮丧的,因为它似乎系统几乎,几乎工作,但不完全!
任何帮助/洞察力都将不胜感激。
发布于 2012-05-25 02:14:04
首先声明:我已经有好几年没有编写我的arduino代码了。
乍一看,你似乎被一个转换错误所困扰。我看到很多从字节到长字节的转换,等等。这里的关键是将事情分解到最简单的级别,并验证每个级别的工作。
首先,我将通过检查Serial.write的返回值是否确实是4来验证发送的字节数。如果Serial.write返回4,那么就像闪烁led一样简单。
在接收端,我想我会使用ReadBytesUntil,因为它似乎被设计来做你想做的事情,并且内置了一些错误检查(超时和只有4个字节)。
我希望这能帮到你。如果没有,遵循金科玉律:当有疑问的时候--发布更多的代码!
发布于 2012-06-10 16:53:51
希望迟来的回复能有所帮助。
发射端的输出数据正确。在您的示例中,myNumber.UL = 0x61A0F00F。当执行代码"Serial.print(myNumber.UL,十六进制);“时,打印类实际上将字符序列作为'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不是3而是4。将条件x==3更改为x==4可以解决您的问题。
https://stackoverflow.com/questions/10737368
复制相似问题