2011-11-06 139 views
1

我試圖讀取/寫入支持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 –

回答

1

如果您尚未這樣做,您應該生成QSerialDevice的doxygen文檔。這個問題似乎在那裏解釋。

在Windows在非緩衝模式:

必須避免的CharIntervalTimeoutTotalReadConstantTimeout等於0。在理論值,它的計劃是在超時方法的 零值AbstractSerial::read()將讀取 數據它們位於緩衝設備驅動程序中(不要與 緩衝區AbstractSerial!)混淆,並立即返回它們。但對於 未知原因,此讀數總是返回0,而不取決於 緩衝區中是否有現成的數據。

因爲read在無緩衝模式下等待數據,我猜waitForReadyReady在該模式下沒有做任何有用的事情。

相關問題