通过串行Arduino和XBee读取数据

时间:2013-01-07 15:48:21

标签: arduino

我有以下内容:

两个Arduinos和两个XBees。我想将数据从一个发送到另一个。 XBees进行通信,因为我有建议测试(将一个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。我能够从Arduino发送字符并在X-CTU的串行监视器中看到它们。这是否意味着它们配置正确?

然后我想把Arduino连接到我的接收器。你可以看到上面的代码。我总是得不到可用的数据。

返回-1表示序列中没有数据。

3 个答案:

答案 0 :(得分:6)

int更改为byte实际上是将int更改为char。非ASCII符号是尝试呈现字符(0b11111111)的结果。十进制中的负数(-1)是二进制的全部,因为默认情况下int是有符号的。查看Bin/Dec/Hex Converter进行验证。

所有这一切都是说xbee.read()会返回byte / char。我无法在the documentation中找到任何内容,但我认为-1是由于错误导致的(基于硬件Serial documentation)。这是因为没有什么可读的。

您可以尝试以下方法:

  • 确保RX / TX线正确。相信我,它发生了。
  • 在阅读之前检查XBee是否有可用数据。 (因为它将等待一个字节准备好被读取,所以你会打印很少的行。)
if (xbee.available()) {
    byte temp= xbee.read();
    Serial.print(temp);
}
  • 使用内置(硬件)。 SoftwareSerial应该可以工作,但根据我的经验,硬件序列更加可靠
    • 根据您的Arduino型号,您可能需要(Disable Auto Reset on Serial Connection)。只有当您尝试从IDE的串行监视器以外的某个地方通过FTDI芯片发送数据时,才需要这样做。(一般来说)。
  • 此主题 Arduino to Arduino XBee Serial Communication 具有非常类似的设置,似乎正在运行。尽可能简化您的工作,然后慢慢添加功能。
  • 直接连接XBee RX&amp; TX线路连接到USB到FTDI连接器,例如this cable或此breakout board

在你有一个可靠的概念证明之前,你应该尽可能简单。一旦它工作,然后一次添加一个功能。这看起来就像你正在做的那样,但这可能会进一步简化(仅通过使用FTDI将Arduinos从等式中删除,使用硬件序列等)。

这听起来像一个非常酷的项目。祝你好运!

答案 1 :(得分:0)

void loop()  {
    unsigned char temp; = 
    if (Serial.available() > 0){
       temp = xbee.read();
       Serial.print("Character received:");
       Serial.println(temp,HEX);
}

试试这段代码 我将你的int temp转换为unsigned char来处理MSB。这个对我有用。但我使用的是Xbee系列2和硬件系列。无论如何,数据处理是主要的。

答案 2 :(得分:0)

我知道它有点晚了,但也许目前仍有人需要此解决方案。

if (xbee.available()) {
    byte temp= xbee.read();
    Serial.print(temp);
}

对于这里接收部分的代码,我将 serial.print(tempt) 更改为 serial.write(tempt)。原因是当我使用 serial.print(variablesname) 时它有点显示 ASCII 代码,但是当我使用 serial.write(variablesname) 时它显示为它假设的那样。如果你们中的任何人仍然坚持这个问题,可以尝试一下。