QtSerialPort成帧错误

时间:2013-04-16 22:07:55

标签: c++ qt serial-port

我为Qt4构建了qtserialport并编写了一个控制台应用程序来记录来自设备的数据,该设备以9600波特,8个数据位,1个停止位和无奇偶校验发送信息,我认为这是串行通信的默认设置。我已设法正确打开端口并按预期记录数据,但每当我关闭应用程序或关闭计算机并尝试重新启动应用程序时,端口打开但给我一个“framingError”。如果我关闭应用程序然后使用超级终端打开端口,端口将正确打开,然后我可以无错误地打开我的控制台应用程序。我已经读过使用奇偶校验可以解决帧错误,但我真的不知道要使用什么设置,甚至不能解决我的问题。

    //constructor
    MyApp::MyApp()
    {
         QSerialPort *serialPort = new QSerialPort(this);

            connect(serialPort,
                    SIGNAL(error(QSerialPort::SerialPortError)),
                    this,SLOT(serialError(QSerialPort::SerialPortError)));

            serialPort->setPortName("COM1");
            serialPort->setBaudRate(9600,QSerialPort::Input);
            serialPort->setStopBits(QSerialPort::OneStop);
            serialPort->setParity(QSerialPort::NoParity);
            serialPort->setDataBits(QSerialPort::Data8);
            serialPort->setFlowControl(QSerialPort::NoFlowControl);

            if(serialPort->open(QIODevice::ReadOnly))
            {
                qDebug() << "Serial port opened at serialPort->portName();
            }
    }

    ...

    void myApp::serialError(QSerialPort::SerialPortError error)
    {
        if(error != QSerialPort::NoError)
        {
            QMetaEnum metaEnum =  QSerialPort::staticMetaObject.enumerator(
            QSerialPort::staticMetaObject.indexOfEnumerator("SerialPortError"));

            QString errStr(metaEnum.valueToKey(error));

            qDebug() << errStr;
        }
    }

3 个答案:

答案 0 :(得分:1)

当UART未检测到停止位时,会产生帧错误。常见原因是:

  • 错误的波特率或在设备发送时更改波特率
  • 设备发送的数据或奇偶校验位数超出预期
  • 停止位数不匹配
  • 重新连接电缆并启动设备
  • 软件在端口打开时未清除错误状态

如果打开端口后只出现一个帧错误,则忽略它。如果它们在设备发送时不断触发,则说明端口配置错误。避免QSerialPort :: NoFlowControl,大多数设备实现硬件握手。像HyperTerminal这样的程序将始终打开它。询问知道设备如何配置的人,这样你就可以停止猜测了。

答案 1 :(得分:0)

您错误地设置了串行端口选项。首先,需要打开串口,然后进行配置!但不像你现在那样。在您的代码中是您遇到FramingError所有问题的原因,因为您的配置未被接受(您至少在set()方法中检查返回值)。因为采用启用奇偶校验检查模式的先前配置。阅读文档,看看示例。

答案 2 :(得分:0)

您应该添加一条语句来捕获 Framing Error 事件的中断中断:

serialPort->notifyOnFramingError(true)

那么, 在catpure代码段添加'break'语句退出。