繁体   English   中英

使用Xbee PRO S1在Arduino和Qt之间发生通信错误

[英]Communication error between Arduino and Qt using Xbee PRO S1

我一直在尝试使用带有其Xbee Shield和两个Xbee Pro S1的Arduino Mega 2560进行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);
}

竖线表示我已经尝试了两种选择...

我注意到,在进行调试时,如果我在ui->label->setText(readData);放置一个断点ui->label->setText(readData); ; 如果它不能很好地到达(完整的“ Confirmado \\ r \\ n”字符串),则此断点在该行中获取两次,第一个readData等于字符串的后半部分(即“ mado \\ r \\ n”),另一个其中一个对字符串的其余部分(即“ Confir”)进行赋值。

我还尝试设置了更高的波特率57600,但我无法发送或接收任何数据,尽管我之前已经在XCTU应用中设置了波特率。

有谁知道从Arduino接收完整字符串的方法吗? 或者至少如何正确设置Arduino和PC的Xbee以使用更高的波特率?

感谢您的回答,也很抱歉我的写作能力...

尝试使用serial->readLine()而不是serial->readall() ,例如,您可以在serial->canReadLine()返回true之后循环等待,然后确保收到的数据是完整字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM