win Qt5 qextserialport替代SerialPort串口类解决readall()异常问题的方法

本文期望的读者对qt的基本使用有一定的了解,故不再对其他博主所作的工作进行详细说明,需要者可以结合其他文章一起看。

在开发串口通信模块的时候发现,使用QT5自带的SerialPort类读取串口,虽然可以实现功能但不稳定,隔一段时间会出现代码跑飞的问题,定位是readall()出现问题,具体原因未知,时间紧迫故不再对具体原因做追溯。可能是是其内存出了问题,有兴趣读者可以排查一下根本原因,期待你的回复。

经过测试qextserialport可以解决该问题,具体设置步骤如下:

官网上下载qextserialport文件QextSerialPort - Browse Files at SourceForge.net

去掉原代码中对SerialPort的引入,

删除pro文件的 QT+=SerialPort;

删除引用SerialPort的头文件;

在原引用头文件的地方增加如下头文件

#include "win_qextserialport.h"

将下载的文件拖入工程所在的文件并在qt编辑界面增加已存在的文件。

其他文章有对使用那些头文件的描述,本文不再赘述,主要是区分linux和win的环境差别。

修改代码:

    serial.setPortName("COM5");//查看自己使用的是哪个串口,直接使用了com5,网上也有自己查找串口的方法
    if (!serial.open(QIODevice::ReadWrite))
    {
        return -1;
    }
    serial.setBaudRate(BAUD115200);//波特率根据实际情况修改,这里是115200
    serial.setDataBits(DATA_8);//这四个一般是默认的,也可以根据实际情况修改
    serial.setParity(PAR_NONE);
    serial.setFlowControl(FLOW_OFF);
    serial.setStopBits(STOP_1);

    QByteArray readData = serial.read(100);//使用QByteArray 接收一个100字节的长度数据,也可以使用char数组接收,网上也有文章。

编译

如果库文件中的toAscii报错,是因为这个方法不支持,将其修改为toLatin1再编译

对数据进行解析,

QByteArray需要逐字解析可以使用如下方式进行,
quint8 a = static_cast<quint8>(readData.at(0));
quint8 b = static_cast<quint8>(readData.at(1));

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值