通过串行Arduino和XBee读取数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过串行Arduino和XBee读取数据相关的知识,希望对你有一定的参考价值。
我有以下内容:
两个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.
如果我将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。我能够从Arduino发送字符并在X-CTU的串行监视器中看到它们。这是否意味着它们配置正确?
然后我想把Arduino连接到我的接收器。你可以看到上面的代码。我总是得不到可用的数据。
返回-1表示序列中没有数据。
将int
改为byte
实际上正在改变为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)。只有当您尝试通过FTDI芯片从IDE的串行监视器以外的某个位置(通常来说)发送数据时,才需要这样做。
- 这个线程Arduino to Arduino XBee Serial Communication有一个非常相似的设置似乎正在工作。尽可能简化您的工作,然后慢慢添加功能。
- 将XBee RX和TX线直接连接到USB-to-FTDI连接器,例如this cable或此breakout board。
在你有一个可靠的概念证明之前,你应该尽可能简单。一旦它工作,然后一次添加一个功能。这看起来就像你已经在做的那样,但这可能会进一步简化(通过仅使用FTDI,使用硬件序列等将Arduinos排除在等式之外)。
这听起来像一个非常酷的项目。祝好运!
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和硬件系列。无论如何,数据处理是主要的。
以上是关于通过串行Arduino和XBee读取数据的主要内容,如果未能解决你的问题,请参考以下文章