我有以下内容:
两个Arduino和两个XBee。我想将数据从一个发送到另一个。XBee通信,因为我有提议的测试(将一个XBee与Arduino连接,另一个连接到PC,从一个写,并在另一个终端中观看另一个(。
现在我想把数据从一个发送到另一个:
这是我的两个脚本:
对于发送(在发送所有信件的前一次测试中进行了测试(:
#include <SoftwareSerial.h>
SoftwareSerial xbee(2, 3); // RX, TX
char c = 'A';
int pingPong = 1;
void setup()
{
Serial.begin(9600);
Serial.println( "Arduino started sending bytes via XBee" );
//Set the data rate for the SoftwareSerial port
xbee.begin(9600);
}
void loop() {
// Send character via XBee to other XBee connected to Mac
// via USB cable.
xbee.write( c );
//--- Display the character just sent on console. ---
Serial.println( c );
//--- Get the next letter in the alphabet, and reset to ---
//--- 'A' once we have reached 'Z'.
c = c + 1;
if ( c>'Z' )
c = 'A';
//--- Switch LED on Arduino board for every character sent---
if ( pingPong == 0 )
digitalWrite(13, LOW);
else
digitalWrite(13, HIGH);
pingPong = 1 - pingPong;
delay( 1000 );
}
问题是当我连接一个Arduino从另一个XBee接收数据时。
这是我的代码:
#include <SoftwareSerial.h>
SoftwareSerial xbee(2, 3); // RX, TX
void setup()
{
Serial.begin(9600);
Serial.println( "Arduino started receiving bytes via XBee" );
// Set the data rate for the SoftwareSerial port.
xbee.begin(9600);
}
void loop() {
int temp = xbee.read();
Serial.print("Character received:");
Serial.println(temp);
delay(1000);
}
输出始终为:
Character received: -1.
如果我将temp
从int
更改为byte
,我会看到Character received: (a non-[ASCII][3] symbol)
。
我正在使用XBee系列1。
它们是通过X-CTU配置的,基于ladyada.net上的一个教程
然后,我将XBee连接到Arduino(TX连接到引脚3,RX连接到引脚2,Vcc和GND(,另一个XBee通过FTDI电缆连接到PC。我能够从阿都诺号上发送人物,并在X-CTU的串行监视器上看到他们。这是否意味着它们配置正确?
然后我想把一个Arduino连接到我的接收器上。您可以看到上面的代码。我总是得不到可用的数据。
返回-1表示序列中没有数据。
将int
更改为byte
实际上就是将int更改为char
。非ASCII符号是尝试呈现字符(0b11111111
(的结果。十进制中的负一(-1
(是二进制中的全一,因为默认情况下int
是有符号的。检查Bin/Dec/Hex转换器进行验证。
也就是说xbee.read()
返回一个byte
/char
。我在文档中找不到任何内容,但我认为-1
是由于错误引起的(基于硬件Serial
文档(。这是因为没有什么可读的。
您可以尝试以下操作:
- 确保RX/TX线路正确。相信我,它会发生的
- 在读取之前,检查XBee是否有可用的数据。(打印的行要少得多,因为它要等到一个字节准备好被读取。(
if (xbee.available()) {
byte temp= xbee.read();
Serial.print(temp);
}
- 使用内置的(硬件(。软件串行应该可以工作,但根据我的经验,硬件串行要可靠得多
- 根据您的Arduino型号,您可能需要(禁用串行连接上的自动重置(。这似乎只有在您试图通过FTDI芯片从IDE的串行监视器以外的地方发送数据时才需要(一般来说(
- 这个线程Arduino到Arduino XBee串行通信有一个非常相似的设置,似乎正在工作。尽可能简化您的工作,然后慢慢添加功能
- 直接连接XBee RX&TX线连接到USB到FTDI连接器,例如此电缆或此转接板
在你有一个有效的概念证明之前,你应该尽可能简单。一旦它开始工作,然后一次添加一个功能。这似乎是你已经在做的事情,但这可能会进一步简化(只使用FTDI,使用硬件串行等,将Arduinos从等式中删除(
这听起来是一个很酷的项目。祝你好运
void loop() {
unsigned char temp; =
if (Serial.available() > 0){
temp = xbee.read();
Serial.print("Character received:");
Serial.println(temp,HEX);
}
试试这个代码
我将您的int temp转换为无符号字符以处理MSB。它对我有用。但我使用了Xbee系列2和硬件系列。无论如何,数据处理是很重要的。
我知道现在有点晚了,但现在可能还有人需要这个解决方案。
if (xbee.available()) {
byte temp= xbee.read();
Serial.print(temp);
}
对于接收部分的此代码,我将serial.print(tempt)
更改为serial.write(tempt)
。原因是当我使用serial.print(variablesname)
时,它有点显示ASCII代码,但当我使用serial.write(variablesname)
时,它会按预期显示。如果你们中的任何人仍然遇到这个问题,可以尝试一下。