1

RS-232 経由でハイパーターミナルにデータを送信する機能があります。この関数は while ループの外では適切に機能しますが、while ループでは最初の 1 回だけ送信し、その後は何も送信しません。

    qDebug() << MESSAGE;
    int choice;
    std::cin >> choice;

    while( choice != 3 )
    {
        switch (choice)
        {
            case 1:
                // Ready to send data 
                port->write("QSerial Port!\r\n");
                break;
            case 2:
                qDebug() << "Todo...";
                break;
            case 3:
                break;
            default:
                qDebug() << "Invalid Choice ...";
        }
        qDebug() << MESSAGE;
        std::cin >> choice;
    }

編集:

#include <QCoreApplication>
#include <iostream>
#include <QDebug>
#include <QSerialPort>

const char MESSAGE[] = "\n----- New Menu ----"
                       "\n1- Send Data     \n"
                       "2- Receive Data    \n"
                       "3- Quit:           \n";


int main(int argc, char *argv[])
{
    QCoreApplication  app(argc, argv);

    QSerialPort *port = new QSerialPort;
    port->setPortName("COM4");


    // Check the validity of the port
    if ( !port->open(QIODevice::ReadWrite) )
    {
        qDebug() << "\nError: " << port->portName() << " port can't be opened ...";
        return -1;
    }else{
        qDebug() << '\n' << port->portName() << " port has been opened successfully ...";
        port->setBaudRate(QSerialPort::Baud9600);
        port->setStopBits(QSerialPort::OneStop);
        port->setDataBits(QSerialPort::Data8);
        port->setParity(QSerialPort::NoParity);
        port->setFlowControl(QSerialPort::NoFlowControl);
        qDebug() << port->portName() << " port has been configured correctly ...";
    }

    qDebug() << MESSAGE;
    int choice;
    std::cin >> choice;

    while( choice != 3 )
    {
        switch (choice)
        {
            case 1:
            {
                // Ready to send data 
                if ( port->write("QSerial Port!\r\n", qstrlen("QSerial Port!\r\n")) == -1)
                {
                    qDebug() << port->errorString();
                }
                //port->bytesWritten(strlen("QSerial Port!\r\n"));
                port->waitForBytesWritten(-1);
                //qDebug() << port->errorString();
            }
                break;
            case 2:
                qDebug() << "Todo...";
                break;
            case 3:
                break;
            default:
                qDebug() << "Invalid Choice ...";
        }
        qDebug() << MESSAGE;
        std::cin >> choice;
    }

    qDebug() << "\n Goodbye ....";
    port->close();
    delete port;
    return app.exec();
}
4

2 に答える 2

1

コードには次の欠陥があります。

1) エラーを処理しません。

2) 書き込み操作の戻り値をチェックしていません。

3) 再度書き込む前にプログラムで待機していないようです。これは正しくありません。sync waitForBytesWritten または async bytesWritten 信号を使用して、次の書き込みの青信号を出します。

最も重要なのは、おそらく最後のポイントです。データがどのように送信されるかは、「ランダムな」動作になります。この特殊なケースでは、入力の待機に時間がかかる可能性があるため、順次送信される可能性がありますが、それでも安定した堅牢なコードではありません。

于 2014-03-16T21:16:43.453 に答える
0

(3)の点については、私は完全には同意できません。最初の書き込みがまだ未解決である間に、2 回目の書き込みを行うことができないということは何もありません。原則として、データは送信キューに追加する必要があります。「前のデータがディスクに書き込まれるまで、このファイルに再度書き込むことはできません」と言っているようなものです。私が行っていたqtserialで同様の問題がありました:

while (..)
{
    <send data>
    <receive data>
}

何かを受け取る前、または新しいデータを書き込む前に、 qApp->processEvents() を実行する必要があることがわかりました。ファイルの読み取り/書き込みと同じ動作を期待していました。私にとって、qtserial は、デバイスが期待するように動作していません。

于 2014-04-14T19:59:30.570 に答える