问题描述
我的设置如下:Arduino Mega UART3 电压电平转换器 Rpi4
数据以 100 毫秒和 1000 毫秒(取决于数据的重要性)从 Arduino 同步发送到 Rpi。并且数据正在通过 GUI 输入从 Rpi 异步发送回 Arduino(还有一个同步发送时间为 1000 毫秒,以防某些帧丢失/损坏)。
Coms 在与 GUI 不同的线程中处理,以提供最佳用户体验。
好吧,一切正常,但我一直在尝试检测 Rpi 是否与 Arduino 失去连接,但没有成功。 (在另一个方向上覆盖着一个串行看门狗。)
我想避免在 Qt 部分使用另一个看门狗,但我找不到合适的信号来检测丢失的串行连接,因为 QSerialPort 不断随机报告超时错误......并且没有其他方法可以成功检测断开连接。
以下是我尝试使用但没有取得太大成功的解决方法:(可能需要进行重大重写...但我需要先指出正确的方向)
// Serial Port Initialization
m_Serial = new QSerialPort();
m_Serial->setPortName("ttyS0");
//m_Serial->setPortName("ttyUSB0");
m_Serial->setBaudrate(QSerialPort::Baud115200);
m_Serial->setDataBits(QSerialPort::Data8);
m_Serial->setParity(QSerialPort::noparity);
m_Serial->setStopBits(QSerialPort::Onestop);
m_Serial->setFlowControl(QSerialPort::NoFlowControl);
m_Serial->open(qiodevice::ReadWrite);
qDebug() << "SerialPort Status: " << m_Serial->isopen();
emit serialConnected(m_Serial->isReadable());
while(!abort)
{
QThread::msleep(5);
while (!isConected(m_Serial)){
emit serialConnected(false);
isSerialConected = false;
QThread::sleep(1);
qDebug() << "Serial Error: ";
//qDebug() << "Is readable?: " << m_Serial->isReadable();
//qDebug() << "Bytes availiable?: " << m_Serial->bytesAvailable();
mutex.lock();
abort = _abort;
mutex.unlock();
}
if (!isSerialConected){
emit serialConnected(true);
isSerialConected=true;
}
mutex.lock();
abort = _abort;
mutex.unlock();
if(!m_outFrameQueue->isEmpty())
{
//qDebug() << "Frame empty";
{ *sendData*}
} else
{
if (m_Serial->waitForReadyRead(10) )
{ *readData*}
以及我试图用来检测是否实际连接的函数:
bool SerialWorker::isConected(QSerialPort *m_Serial){
// qDebug() << "SerialPort Error: " << m_Serial->error();
// qDebug() << "SerialPort isReadable: " << m_Serial->isReadable();
// qDebug() << "SerialPort isReadable: " << m_Serial->bytesAvailable();
if (m_Serial->error() == QSerialPort::SerialPortError::NoError){
return true;
}
else if (m_Serial->error() == QSerialPort::SerialPortError::TimeoutError){
m_Serial->clearError();
//m_Serial->reset();
return true;
}else{
m_Serial->reset();
m_Serial->close();
m_Serial->clearError();
QThread::sleep(1);
m_Serial->open(qiodevice::ReadWrite);
return false;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)