QSerialPort在while循环中?

时间:2014-03-16 21:06:29

标签: c++ qt qt5 qtcore qtserialport

我有一个通过RS-232将数据发送到Hyperterminal的功能。该函数在while循环中正常工作,但是,在while循环中,它仅在第一次发送,之后它不发送任何内容。

    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();
}

2 个答案:

答案 0 :(得分:1)

您的代码存在以下缺陷:

1)您没有处理错误。

2)您不检查写操作的返回值。

3)在再次写作之前,你似乎没有以编程方式等待。这是不正确的。使用sync waitForBytesWritten或async bytesWritten信号为下一次写入提供绿灯。

最关键的可能是最后一点。它会导致&#34;随机&#34;行为如何发送数据。在这种特殊情况下,它可能会按顺序发送,因为等待输入可能需要更长的时间,但它仍然不是稳定且可靠的代码。

答案 1 :(得分:0)

我不能完全赞同第(3)点。 没有任何东西可以说你不能做第二次写作,而第一次写作仍然很出色。原则上,数据应该只添加到传输队列中。 这就像说&#34;你不能再写这个文件,直到先前的数据写入磁盘&#34;。 我在qtserial遇到了类似的问题:

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

原则上你必须先接受qApp-&gt; processEvents()才能收到任何内容 或者在你可以写新数据之前。 我期待与读取/写入文件相同的行为。 对我而言,qtserial并不像你期望的那样表现。