1

我有一个通过 RS-232 向超级终端发送数据的功能。该函数在 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();
}
4

2 回答 2

1

您的代码存在以下缺陷:

1)您不处理错误。

2)你没有检查写操作的返回值。

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

最关键的可能是最后一点。这将导致如何发送数据的“随机”行为。在这种特殊情况下,它可能会按顺序发送,因为等待输入可能会花费您更长的时间,但编写的代码仍然不稳定且健壮。

于 2014-03-16T21:16:43.453 回答
0

我不能完全同意第(3)点。没有什么可以说你不能写第二个,而第一个仍然很出色。原则上,数据应该只是添加到传输队列中。这就像说“在先前的数据写入磁盘之前,您不能再次写入此文件”。我在做 qtserial 时遇到了类似的问题:

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

事实证明,您必须先执行 qApp->processEvents() 才能接收任何内容或写入新数据。我期待与读取/写入文件相同的行为。对我来说,qtserial 的行为不像您期望的设备那样。

于 2014-04-14T19:59:30.570 回答