本文期望的读者对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));