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

问题描述:

我试图读取/写入支持RS-232的设备。这在Linux上没有问题。该设备通过Digitus USB /串行适配器连接。Qt C++和QSerialDevice:Windows 7 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。

+0

作为更新:使用SerialMonitor,可以打开设备,并按预期工作。所以这不是一个Windows的东西,但不知何故与我如何使用QSerialDevice –

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

在Windows在非缓冲模式:

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

因为read在无缓冲模式下等待数据,我猜waitForReadyReady在该模式下没有做任何有用的事情。