Задать вопрос
Il_noor
@Il_noor
Физик

Почему QSerialPort считывает только первый символ?

Добрый день
С помощью QSerialPortInfo получаю возможные COM ports.
Если они не заняты, то отправляю байты.
Получаю только один символ.

for (const QSerialPortInfo &info : QSerialPortInfo::availablePorts()){
            if (!info.isBusy())
            {
                QSerialPort newSerialPort;
                newSerialPort.setPortName(info.portName());
                newSerialPort.setBaudRate(QSerialPort::Baud9600);
                newSerialPort.setStopBits(QSerialPort::OneStop);
                newSerialPort.setDataBits(QSerialPort::Data8);
                newSerialPort.setParity(QSerialPort::NoParity);
                newSerialPort.setFlowControl(QSerialPort::NoFlowControl);
                newSerialPort.open(QIODevice::ReadWrite);
                    QByteArray ba;
                    ba.resize(5);
                    ba[0] = 0x55;
                    ba[1] = 0x55;
                    ba[2] = 0x00;
                    ba[3] = 0x00;
                    ba[4] = 0xaa;
                    newSerialPort.write(ba);
                    QByteArray data = newSerialPort.readAll();
                    qDebug() << "data" << data; // выводит только первый символ
}
}


Если все это делаю без for (const QSerialPortInfo &info : QSerialPortInfo::availablePorts()){
То получаю полноценный ответ
В чем может быть причина?
  • Вопрос задан
  • 644 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Нетология
    Специалист по информационной безопасности + нейросети
    12 месяцев
    Далее
  • Компьютерная академия «TOP»
    Учебная программа “Разработка программного обеспечения”
    30 месяцев
    Далее
Решения вопроса 1
Il_noor
@Il_noor Автор вопроса
Физик
Всем большое спасибо)
А вот решение
Взял отсюда: doc.qt.io/qt-5/qtserialport-blockingmaster-example.html

portCOM->write(ba);
portCOM->waitForReadyRead(200);

QByteArray data = portCOM->readAll();
while (portCOM->waitForReadyRead(10))
data += portCOM->readAll();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@D3Nd3R
Используйте QSerialPort::waitForReadyRead() прежде чем читать из порта.
Так же можно реализовать асинхронное чтение, написав обработчик для сигнала readyRead().
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ДАЛЕЕ Москва
от 200 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽
Уницифра Краснодар
от 180 000 до 200 000 ₽