Я пытался создать 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 и ПК для работы с более высокой скоростью передачи данных?
Спасибо за ответы, и извините за мои навыки письма …
Попробуй использовать serial->readLine()
вместо serial->readall()
Вы можете, например, ждать в цикле после serial->canReadLine()
возвращает true, тогда вы будете уверены, что полученные данные являются полной строкой.
Других решений пока нет …