Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确处理通信错误?QT串行端口_C++_Qt_Serial Port - Fatal编程技术网

C++ 如何正确处理通信错误?QT串行端口

C++ 如何正确处理通信错误?QT串行端口,c++,qt,serial-port,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 My

我通过串口进行双向通信

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将自动处理串行端口错误,或者我应该检测并抛出它们吗

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

这是:

if (serial->write(data.toLocal8Bit()) < 0 )
    emit serial->error(QSerialPort::WriteError);  
是错误的,既然QSerialPort类已经发出了信号,为什么要自己做呢

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

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