Ошибка связи между Arduino и Qt при использовании Xbee PRO S1

Я пытался создать Lights GUI с Arduino Mega 2560 с Xbee Shield и двумя Xbee Pro S1, один из которых подключен к Arduino, а другой — к ПК. Моя проблема: как бы я ни отправлял данные из 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? Или, по крайней мере, как правильно настроить Xbee от Arduino и ПК для работы с более высокой скоростью передачи данных?

Спасибо за ответы, и извините за мои навыки письма …

0

Решение

Попробуй использовать serial->readLine() вместо serial->readall() Вы можете, например, ждать в цикле после serial->canReadLine() возвращает true, тогда вы будете уверены, что полученные данные являются полной строкой.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]