通过串行Arduino和XBee读取数据



我有以下内容:

两个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.

如果我将tempint更改为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) 时,它会按预期显示。如果你们中的任何人仍然遇到这个问题,可以尝试一下。

最新更新