Arduino 和 Qt 使用 Xbee PRO S1 之间的通信错误
Communication error between Arduino and Qt using Xbee PRO S1
我一直在尝试用带有 Xbee Shield 的 Arduino Mega 2560 和两个 Xbee Pro S1 做一个 Lights GUI,一个连接到 Arduino,另一个连接到 PC。我的问题是:但是我可以将数据从 Qt 发送到我的 arduino 并读取它,我不能用其他方式做同样的事情。当尝试将字符串作为 "Confirmado\r\n" 发送时,它错误地到达了我的 Qt 标签,有时我得到完整的字符串,其他的我收到一半。
我的arduino代码是
char buffer[50];
String trama, dir, com, data;
int indexdir, indexcom, indexdata;
void setup(){
Serial.begin(9600);
}
void loop(){
trama= "Confirmado\r\n";
const char *bf = trama.c_str();
if(Serial.available() > 0)
{
Serial.readBytesUntil('/', buffer,500);
Serial.print(bf);
Serial.flush();
}
}
我的 Qt QSerialPort 配置是
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
serial = new QSerialPort(this);
serial->setPortName("COM3"); //COM-port your Arduino is connected to
serial->open(QIODevice::ReadWrite);
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
connect(serial,SIGNAL(readyRead()),this,SLOT(serialReceived()));
}
然后我像这样发送和读取数据
void MainWindow::serialReceived()
{
QByteArray readData = serial->readAll();
//while (serial->waitForReadyRead(500))
// readData.append(serial->readAll());
ui->label->setText(readData);
}
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
serial->flush();
serial->waitForBytesWritten(500);
}
toogle 行意味着我已经尝试了两个选项...
我注意到,在进行调试时,如果我在 ui->label->setText(readData);
中放置一个断点;如果它没有很好地到达(完整的 "Confirmado\r\n" 字符串),这个断点会在这一行中出现两次,第一个 readData 等于字符串的后半部分(即 "mado\r\n"),另一个它赋值字符串的其余部分(即 "Confir")。
我也试过设置更高的波特率,57600,但我无法发送或接收任何数据,尽管我之前已经在 XCTU 应用程序中设置了波特率。
有谁知道从 Arduino 接收完整字符串的方法吗?或者知道如何正确设置 Arduino 和 PC 的 Xbee 以使用更高的波特率?
感谢您的回答,对不起我的写作技巧...
尝试使用 serial->readLine()
而不是 serial->readall()
例如,您可以在 serial->canReadLine()
returns 之后循环等待,然后确保收到数据是一个完整的字符串。
我一直在尝试用带有 Xbee Shield 的 Arduino Mega 2560 和两个 Xbee Pro S1 做一个 Lights GUI,一个连接到 Arduino,另一个连接到 PC。我的问题是:但是我可以将数据从 Qt 发送到我的 arduino 并读取它,我不能用其他方式做同样的事情。当尝试将字符串作为 "Confirmado\r\n" 发送时,它错误地到达了我的 Qt 标签,有时我得到完整的字符串,其他的我收到一半。
我的arduino代码是
char buffer[50];
String trama, dir, com, data;
int indexdir, indexcom, indexdata;
void setup(){
Serial.begin(9600);
}
void loop(){
trama= "Confirmado\r\n";
const char *bf = trama.c_str();
if(Serial.available() > 0)
{
Serial.readBytesUntil('/', buffer,500);
Serial.print(bf);
Serial.flush();
}
}
我的 Qt QSerialPort 配置是
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
serial = new QSerialPort(this);
serial->setPortName("COM3"); //COM-port your Arduino is connected to
serial->open(QIODevice::ReadWrite);
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
connect(serial,SIGNAL(readyRead()),this,SLOT(serialReceived()));
}
然后我像这样发送和读取数据
void MainWindow::serialReceived()
{
QByteArray readData = serial->readAll();
//while (serial->waitForReadyRead(500))
// readData.append(serial->readAll());
ui->label->setText(readData);
}
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
serial->flush();
serial->waitForBytesWritten(500);
}
toogle 行意味着我已经尝试了两个选项...
我注意到,在进行调试时,如果我在 ui->label->setText(readData);
中放置一个断点;如果它没有很好地到达(完整的 "Confirmado\r\n" 字符串),这个断点会在这一行中出现两次,第一个 readData 等于字符串的后半部分(即 "mado\r\n"),另一个它赋值字符串的其余部分(即 "Confir")。
我也试过设置更高的波特率,57600,但我无法发送或接收任何数据,尽管我之前已经在 XCTU 应用程序中设置了波特率。
有谁知道从 Arduino 接收完整字符串的方法吗?或者知道如何正确设置 Arduino 和 PC 的 Xbee 以使用更高的波特率?
感谢您的回答,对不起我的写作技巧...
尝试使用 serial->readLine()
而不是 serial->readall()
例如,您可以在 serial->canReadLine()
returns 之后循环等待,然后确保收到数据是一个完整的字符串。