我通过串口进行双向通信。
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;抛出它们?
两种方法中的哪一种更正确?或者他们都不正确?
答案 0 :(得分:0)
此:
if (serial->write(data.toLocal8Bit()) < 0 )
emit serial->error(QSerialPort::WriteError);
是错误的,因为QSerialPort
类已经发出信号,你为什么要自己做?
您应该同时处理error
发出的QSerialPort
信号,并处理write
,read
和其他方法返回的任何即时错误。您需要处理信号,因为读取和写入是异步发生的。写入“成功”并返回您想要的字节数,这只是意味着设备已打开并且此时处于“可用”状态。实际写入在后台发生,可能随时失败。
简单而正确的做法是拥有一个实现您所追求的通信协议的状态机。状态机框架可以帮助您。