2014-02-11 41 views
0

我有一個通過串行端口的雙向通信。如何正確處理通訊錯誤? QT SerialPort

MyClass::MyClass(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    //setUp 

    connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, 
      SLOT(handleError(QSerialPort::SerialPortError))); 
} 

void MyClass::handleError(QSerialPort::SerialPortError error) 
{ 
    //show error 
    //close connection 
} 

void MyClass::send(QString data) 
{ 
    if(!data.endsWith('\r')) 
     data.append('\r'); 

    //should be like this: 
    serial->write(data.toLocal8Bit()); 
    serial->waitForBytesWritten(TIMEOUT); 


    //or this? 
    if(serial->write(data.toLocal8Bit()) < 0) 
     emit serial->error(QSerialPort::WriteError);  

    if(!serial->waitForBytesWritten(TIMEOUT)) 
     emit serial->error(QSerialPort::TimeoutError); 

} 

void MyClass::receive(char &dest, int size) 
{ 
    //similar to send 
} 

也就是說,的HandleError會自動處理串行端口錯誤或我應該檢測&扔?

2種方法哪種更正確?或者沒有一個是正確的?

回答

0

此:

if (serial->write(data.toLocal8Bit()) < 0) 
    emit serial->error(QSerialPort::WriteError); 

是錯誤的,因爲QSerialPort類已經發出信號,你爲什麼要自己做呢?

您應該同時處理QSerialPort發出的error信號,並處理由write,read和其他方法返回的任何即時錯誤。您需要處理信號,因爲讀取和寫入是異步發生的。寫「成功」並返回您想要的字節數的操作只是表示設備已打開並且此刻處於「可用」狀態。實際寫入發生在後臺,並可能隨時失敗。

簡單,正確的事情,就是有一個實現了通信協議之後你是一個狀態機。狀態機框架可以幫助你。