2014-01-16 122 views
3

我們在我們的硬件中使用FTDI串行端口CHIP。現在我們在Linux中有工作代碼,並轉移到了Windows 7.我們遇到了一些奇怪的問題。qt 5.2使用Windows 7的串行端口寫入問題

問題: 不運行它做其他控制檯應用程序,我們無法將數據寫入到串行端口:

serial.setPortName("COM3"); 
     if (serial.open(QIODevice::ReadWrite)) { 
      bool success = serial.setBaudRate(QSerialPort::Baud9600) & 
      serial.setStopBits(QSerialPort::OneStop) & 
      serial.setDataBits(QSerialPort::Data8) & 
      serial.setParity(QSerialPort::NoParity) & 
      serial.setFlowControl(QSerialPort::NoFlowControl); 
      qDebug() << "Connected to usb device: " << (success ? "OK" : "FAIL"); 

      while(true) { 
       if(serial.waitForReadyRead(-1)) { 
        QByteArray out = serial.readAll(); 
        for(int i=0; i< out.length(); i++) { 
         qDebug() << (int) out[i]; 
        } 
       } 
      } 
      serial.close(); 

所以它與閱讀都只是循環。硬件不會發送任何東西,所以讀取只是無限循環。關閉並運行我們的寫入程序後,它會正確運行。

char* input; 
input = new char[size+3]; 
QByteArray bytearr; 

for(int i=0;i<size+2;i++) { 
    input[i] = (char) package[i]; 
    bytearr.append((unsigned char) package[i]); 
} 


QString serialPortName = "COM3"; 
QSerialPort serialPort; 
serialPort.setPortName(serialPortName); 
serialPort.open(QIODevice::ReadWrite); 
serialPort.write(bytearr); 
serialPort.flush(); 
serialPort.close(); 

運行後讀取一切正常,但沒有閱讀全部,它不會工作。我們做錯了什麼? 謝謝。

+0

你寫的應用程序(用標準C POSIX)和QtSerialPort閱讀器?是嗎?你將移動到Windows的哪一部分?你是「OK」還是「FAIL」?此外,你永遠不會離開永遠while循環...因爲沒有休息或轉到...爲什麼你不檢查設置的返回值,看看他們是否成功?如果我確定這是正確的,那將是首先要做的事情。另外,你的代碼不完整,請修改。另外,你是否嘗試過從git運行sync writer和reader例子? – lpapp

+2

也,您使用'&'而不是「&&」。它可能在布爾型的這種特殊情況下工作,但請注意,您正在按位進行AND操作,而不是邏輯操作。 – lpapp

+0

是的,它是讀寫器的C posix和QtSerialPort。兩種不同的控制檯應用 按位我試圖做的,所以一個&是okey。 – user257980

回答

1

我發現QT的串口SW需要你來處理QT事件才能工作。 在讀取之前將qApp-> processEvents()放入循環中使其適用於我。

(在Windows-7 QT 4.8.5)

2

我們在與FTDI芯片的基板上應用了類似的問題。我們嘗試寫入19200波特/秒的字節,儘管實際上約爲1200波特/秒(使用示波器可見)。問題是在寫入一個字節後立即關閉串行端口。在關閉端口之前等待使用QThread :: msleep(5)。看起來,設備在關閉操作過程中得到一個重置或某些東西,最新的字節以假波特率和其他參數發送。