Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QSerialPort принимает только один байт.



  • Замыкаю выходы Tx/Rx друг на друга. Передаю *IDN? . Осциллограф показывает передачу всех 5 байт. Но readAll( ) создает QByteArray лишь с одним первым символом.

    #include <QCoreApplication>
    #include <QtSerialPort>
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        printf("initialization...\n"); //debug
        QSerialPort serial;
        serial.setPortName("COM2");
        serial.setBaudRate(QSerialPort::Baud9600);
        serial.setDataBits(QSerialPort::Data8);
        serial.setParity(QSerialPort::NoParity);
        serial.setStopBits(QSerialPort::OneStop);
        serial.setFlowControl(QSerialPort::NoFlowControl);
        serial.open(QSerialPort::ReadWrite);
    
        QString sendData("*IDN?");
        printf("send data:    "); //debug
        printf(sendData.toUtf8()); //debug
        serial.write(sendData.toUtf8());
        serial.waitForBytesWritten(1000);
        serial.waitForReadyRead(1000);
        QByteArray receiveData = serial.readAll();
        printf("\nreceive data: "); //debug
        printf(receiveData.data()); //debug
        printf("\nreceive byts: "); //debug
        printf("%d\n", receiveData.size()); //debug
        serial.close();
        printf("end"); //debug
    
        return a.exec();
    }
    

    Использую демоплату USB-UART "PL2303" от WaveShare с чипом PL2303TA. Выходы только Tx/Rx. Среда - Windows 7 и Qt5.10.0 .
    Пробовал данный код также на переходнике UAS-DB9M-02 от Gembird. Всё аналогично - принимается только первый символ.
    Пробовал передачу/прием с обоими переходниками при помощи COM Port Toolkit 4.0. Прием/передача сообщений проходят на отлично.
    Пробовал передачу/прием *IDN? на PL2303 при помощи примера LabVIEW. Всё работает без проблем.
    Питание проверил, БИОС перепрошил, монитор протёр. Что я делаю не так?



  • Повесь сигнал готовности порта к приему данных на слот приема данных:
    connect(&serial, SIGNAL(readyRead()),this,SLOT(ReadFromPort()));

    void ReadFromPort(){
    QByteArray data;
    data.append(thisPort.readAll());
    qDebug() << data;
    }

    Я вообще юзал порт в другом потоке:
    http://we.easyelectronics.ru/electro-and-pc/qthread-qserialport-krutim-v-otdelnom-potoke-rabotu-s-som-portom.html