簡體   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