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和其他方法返回的任何即时错误。您需要处理该信号,因为读取和写入是异步进行的。写入成功并返回您想要的字节数,只意味着设备处于打开状态且此时处于可用状态。实际写入发生在后台,随时可能失败
简单而正确的做法是使用一个状态机来实现您所追求的通信协议。状态机框架可以帮助您