【问题标题】:QtSerialPort framing errorQtSerialPort 成帧错误
【发布时间】:2013-04-16 22:07:55
【问题描述】:

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

    //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;
        }
    }

【问题讨论】:

  • 请发布一些代码(初始化部分)。在大多数情况下,这是由于波特率设置不当造成的。然后您运行一个超级终端,它会正确设置波特率/奇偶校验/等,因此您的应用程序只需重用正确的设置,这就是您没有这些错误的原因。
  • @evliruff 我已经添加了代码,设置和超级终端一样。

标签: c++ qt serial-port


【解决方案1】:

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

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

如果您在打开端口后只收到一个帧错误,请忽略它。如果它们在设备发送时不断触发,那么您配置的端口错误。请避免使用 QSerialPort::NoFlowControl,大多数设备都实现了硬件握手。像超级终端这样的程序总是会打开它。向了解设备的人询问它是如何配置的,这样你就可以停止猜测了。

【讨论】:

  • 谢谢你,但不幸的是,作为一个了解该设备的人是不可能的。关于流量控制,我会尝试将设置更改为 QSerialPort::HardwareControl,看看是否有区别。
  • 顺便说一句,我改变了它,它没有任何区别。我试图复制错误,发生的唯一方法是当设备仍在发送数据时强制计算机关闭......再次唯一的解决方法是再次打开超级终端和我的应用程序。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    serialPort->notifyOnFramingError(true)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 2017-08-23
      • 2014-08-20
      • 2016-06-07
      • 2014-09-11
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多