首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtSerialPort成帧错误

QtSerialPort成帧错误
EN

Stack Overflow用户
提问于 2013-04-17 06:07:55
回答 3查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
    //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;
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-17 08:06:53

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

当设备发送错误的波特率或更改波特率时,不匹配设备发送的数据或奇偶校验位的数量比您预期的多

  • 在设备通电的情况下停止电缆的次数不匹配

  • 软件在端口打开时未清除错误状态

<>F211>

如果在打开端口后只有一个帧错误,那么就忽略它。如果它们在设备发送时不断触发,则说明端口配置错误。一定要避免QSerialPort::NoFlowControl,大多数设备都实现硬件握手。像HyperTerminal这样的程序总是会打开它。询问了解该设备如何配置的人,这样您就可以停止猜测了。

票数 1
EN

Stack Overflow用户

发布于 2013-04-19 15:51:43

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-01 20:08:53

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

代码语言:javascript
复制
serialPort->notifyOnFramingError(true)

然后,在猫纯代码段中,添加'break‘语句以退出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16048001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档