繁体   English   中英

Qt C ++和QSerialDevice:Windows 7 USB->串行端口读取/写入

[英]Qt C++ and QSerialDevice: Windows 7 USB->Serial Port Reading/Writing

我试图读取/写入支持RS-232的设备。 这在Linux上没有问题。 该设备通过Digitus USB /串行适配器连接。

设备在设备管理器中显示为COM4。

void PayLife::run() {
    this->sendingData = 0;
    this->running = true;
    qDebug() << "Starting PayLife Thread";
    this->port = new AbstractSerial();
    this->port->setDeviceName(this->addy);
    QByteArray ba;
    if (port->open(AbstractSerial::ReadWrite| AbstractSerial::Unbuffered)) {
        if (!port->setBaudRate(AbstractSerial::BaudRate19200)) {
            qDebug() << "Set baud rate " <<  AbstractSerial::BaudRate19200 << " error.";
            goto end_thread;
        };

        if (!port->setDataBits(AbstractSerial::DataBits7)) {
            qDebug() << "Set data bits " <<  AbstractSerial::DataBits7 << " error.";
            goto end_thread;
        }

        if (!port->setParity(AbstractSerial::ParityEven)) {
            qDebug() << "Set parity " <<  AbstractSerial::ParityEven << " error.";
            goto end_thread;
        }

        if (!port->setStopBits(AbstractSerial::StopBits1)) {
            qDebug() << "Set stop bits " <<  AbstractSerial::StopBits1 << " error.";
            goto end_thread;
        }

        if (!port->setFlowControl(AbstractSerial::FlowControlOff)) {
            qDebug() << "Set flow " <<  AbstractSerial::FlowControlOff << " error.";
            goto end_thread;
        }
        while(this->running) {
            if ((port->bytesAvailable() > 0) ||  port->waitForReadyRead(900)) {
                ba.clear();
                ba = port->read(1024);
                qDebug() << "Readed is : " << ba.size() << " bytes";
            }
            else {
                qDebug() << "Timeout read data in time : " << QTime::currentTime();
            }
        }
    }
    end_thread:
    this->running = false;
}

在Linux上,我不使用QSerialDevice,而只是常规的串行读取/写入。

无论如何,我总是得到:

Starting PayLife Thread 
Readed is :  0  bytes 
Timeout read data in time :  QTime("16:27:43") 
Timeout read data in time :  QTime("16:27:44") 
Timeout read data in time :  QTime("16:27:45") 
Timeout read data in time :  QTime("16:27:46")

我不确定为什么。

注意,我首先尝试使用常规Windows API进行读取和写入,但结果相同,即它只是不准备从设备中读取任何数据。

我100%肯定会从设备中读取某些内容,因为它会在连接中向ENQ发送垃圾邮件。

如果尚未生成QSerialDevice的doxygen文档, QSerialDevice这样做。 该问题似乎在那里得到解释。

在Windows非缓冲模式下:

必须避免CharIntervalTimeoutTotalReadConstantTimeout的值等于0。从理论上讲,计划在超时值为零时,方法AbstractSerial::read()将读取缓冲区设备驱动程序中的数据(不要与缓冲区驱动程序混淆)。缓冲AbstractSerial !)并立即返回它们。 但是由于未知的原因,该读数始终返回0,而不取决于缓冲区中是否有现成的数据。

因为read在无缓冲模式下等待数据,所以我猜waitForReadyReady在该模式下没有任何用处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM