C++ QSerialPort仅在第二次打开后正确读取

C++ QSerialPort仅在第二次打开后正确读取,c++,serial-port,qt5,C++,Serial Port,Qt5,我有一个使用串行输入的程序。它安装在很多同时具有Win7和Win10的机器上。在某些机器上,我遇到了一个奇怪的问题,即当首先打开串行端口时,它会读取奇怪/不正确的值,主要是0xff。当我关闭端口并重新打开它时,它工作正常 m_port = new QSerialPort( info ); // some info from QSerialPortInfo::availablePorts(); if( m_port->open( QIODevice::ReadOnly )

我有一个使用串行输入的程序。它安装在很多同时具有Win7和Win10的机器上。在某些机器上,我遇到了一个奇怪的问题,即当首先打开串行端口时,它会读取奇怪/不正确的值,主要是0xff。当我关闭端口并重新打开它时,它工作正常

    m_port = new QSerialPort( info ); // some info from QSerialPortInfo::availablePorts();

    if( m_port->open( QIODevice::ReadOnly ) )
    {
        m_port->setBaudRate( m_baudRate );
        m_port->setDataBits( m_dataBits );
        m_port->setParity( m_parity );
        m_port->setStopBits( m_stopBits );
        m_port->setFlowControl( QSerialPort::FlowControl::HardwareControl );
        m_port->clear();
     }
}


所以我很幸运,它可以在我90%的安装上工作,并且缺少一些明确的设置,或者可能是Qt中的一个bug?(5.6.0 msvc 2013)

这里的问题很可能是您在打开串行端口后正在设置它。因此,在很短的一段时间内,您的设置可能处于异常状态。它在您第二次打开端口时起作用,因为从您第一次打开端口时起设置就已正确设置

调用
open
时,
QSerialPort
将应用串行端口设置

m_port = new QSerialPort( info ); // some info from QSerialPortInfo::availablePorts();

m_port->setBaudRate( m_baudRate );
m_port->setDataBits( m_dataBits );
m_port->setParity( m_parity );
m_port->setStopBits( m_stopBits );
m_port->setFlowControl( QSerialPort::FlowControl::HardwareControl );

if( m_port->open( QIODevice::ReadOnly ) )
{
    m_port->clear();
}

这里最可能的问题是,您在打开串行端口后正在设置该端口的设置。因此,在很短的一段时间内,您的设置可能处于异常状态。它在您第二次打开端口时起作用,因为从您第一次打开端口时起设置就已正确设置

调用
open
时,
QSerialPort
将应用串行端口设置

m_port = new QSerialPort( info ); // some info from QSerialPortInfo::availablePorts();

m_port->setBaudRate( m_baudRate );
m_port->setDataBits( m_dataBits );
m_port->setParity( m_parity );
m_port->setStopBits( m_stopBits );
m_port->setFlowControl( QSerialPort::FlowControl::HardwareControl );

if( m_port->open( QIODevice::ReadOnly ) )
{
    m_port->clear();
}

在调用clear()之前睡一会儿也不会有什么坏处。不过,可能需要与设备发送的数据重新同步。最坏的情况是,他必须指示用户在启动程序后才打开设备。这听起来似乎有道理。只要日本的客户打开teamviewer,我就会接受答案,我可以测试修复。不是这样,但我发现了错误。这仍然比以前更正确,在调用clear()之前先睡一会儿也不会有什么害处。不过,可能需要与设备发送的数据重新同步。最坏的情况是,他必须指示用户在启动程序后才打开设备。这听起来似乎有道理。只要日本的客户打开teamviewer,我就会接受答案,我可以测试修复。不是这样,但我发现了错误。这比以前更加正确,