通过串口Arduino和XBee读取数据

6

我有以下设备:

两个 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表示串行中没有数据。

你正在使用哪个Arduino板和版本? - ZnArK
我尝试过将Arduino Uno与Uno配对,以及Arduino Uno与Micro配对。 - ghostrider
3个回答

7
int 转换为 byte 实际上是将 int 转换为 char。非 ASCII 符号是尝试呈现字符 (0b11111111) 的结果。十进制中的负一 (-1) 在二进制中全是一,因为默认情况下 int 是有符号的。请到 Bin/Dec/Hex Converter 进行验证。
总之,xbee.read() 返回一个 byte/char。我没有在文档中找到任何信息,但我认为 -1 是由于错误导致的(基于硬件的 Serial 文档)。这是因为没有东西可以读取。
你可以尝试以下方法:
  • 确保 RX/TX 线路正确连接。
  • 在读取之前检查 XBee 是否有可用数据。(你将获得更少的行打印,因为它将等待一个字节准备好再读取。)
if (xbee.available()) {
    byte temp= xbee.read();
    Serial.print(temp);
}
  • 使用内置的 (硬件) 串口。SoftwareSerial 应该可以工作,但在我的经验中,硬件串口更加可靠。
    • 根据您的 Arduino 型号,您可能需要 (禁用串行连接上的自动重置)。一般情况下,只有在尝试从 IDE 的 串行监视器 以外的地方发送数据时才需要这样做。
  • 这个线程 Arduino to Arduino XBee Serial Communication 有一个非常类似的设置,看起来正在工作。尽可能简化你的努力,然后慢慢添加功能。
  • 将 XBee RX 和 TX 线直接连接到 USB-to-FTDI 连接器,例如 这个电缆 或这个 分线板

在你拥有一个工作的概念验证之前,你应该尽可能简单。一旦它工作了,就逐个添加功能。这似乎是你已经在做的事情,但这可能可以进一步简化(通过仅使用 FTDI 剔除 Arduino,使用硬件串口等)。

这听起来是一个相当酷的项目。祝你好运!


它总是进入else..,“无数据可用”。仅使用FTDI才能正常工作。 - ghostrider
如果FTDI正常工作,那么尝试使用Arduino的硬件串口。我怀疑问题出在使用“SoftwareSerial”或RX / TX线路混淆上(可能两者都有)。您可以尝试将Arduino设置为[三态模式](http://electronics.stackexchange.com/a/27774/10697),以确保在使用硬件串口时您的RX / TX引脚正确。一旦这个问题解决了,就可以开始调试代码了。 - ZnArK
我尝试更改端口(TX和RX),以防我连接错误,但仍然没有变化。我将使用硬件串行再次检查。 - ghostrider
我找不到如何使用硬件串口的任何示例?你是什么意思? - ghostrider
硬件串口也不起作用。那么问题在哪里检查?他们与FTDI通信的事实是否意味着它们已正确配置? - ghostrider
显示剩余5条评论

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和硬件串口。无论如何,数据处理很重要。


0

我知道现在可能有人仍然需要这个解决方案,虽然有点晚了。

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

对于这里接收部分的代码,我将serial.print(tempt)更改为serial.write(tempt)。原因是当我使用serial.print(variablesname)时,它会显示ASCII代码,但当我使用serial.write(variablesname)时,它会显示应该展示的内容。如果你们中还有人遇到这个问题,可以试一试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接