如何正确处理通信错误? QT SerialPort

时间:2014-02-11 10:16:22

标签: c++ qt serial-port

我通过串口进行双向通信。

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 会自动处理串口错误,或者我应该检测到&amp;抛出它们?

两种方法中的哪一种更正确?或者他们都不正确?

1 个答案:

答案 0 :(得分:0)

此:

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

是错误的,因为QSerialPort类已经发出信号,你为什么要自己做?

您应该同时处理error发出的QSerialPort信号,并处理writeread和其他方法返回的任何即时错误。您需要处理信号,因为读取和写入是异步发生的。写入“成功”并返回您想要的字节数,这只是意味着设备已打开并且此时处于“可用”状态。实际写入在后台发生,可能随时失败。

简单而正确的做法是拥有一个实现您所追求的通信协议的状态机。状态机框架可以帮助您。