QT接收并解析GPS模块串口数据

目录

一、QT读取串口数据

二、解析数据


目标:

使用QT,读取gps模块的串口数据,并解析其中的经纬高数据,然后进行处理

一、QT读取串口数据

变量定义

cpp 复制代码
QSerialPort *serial;
QSerialPortInfo SerialPortInfo;
QByteArray lineData;

串口初始化

cpp 复制代码
//初始化串口
void serialPort::initSerialPort() {
	serial = new  QSerialPort;

	QList<QSerialPortInfo> listCom;//获取串口列表
	listCom = QSerialPortInfo::availablePorts();
	for (int i = 0; i < listCom.size(); i++)
		qDebug() << "串口名称:" << listCom[i].portName();//打印串口信息

	foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())//搜索串口,获取串口列表
	{
		if (info.portName() == "COM3") {//在串口列表中查找
						  //此处使用的是判断串口描述说明相同
			SerialPortInfo = info;//储存串口信息
			serial->setPort(info);//设置串口
			break;//找到所需要的串口信息,退出循环
		}//使用if语句判断是否所需串口
	}
	if (SerialPortInfo.portName() == "COM3") {
		qDebug() << "所需串口已找到,具体信息如下:";
		qDebug() << "Name : " << SerialPortInfo.portName();//串口名称,比如com3
		qDebug() << "Description : " << SerialPortInfo.description();//串口描述说明
		qDebug() << "Manufacturer: " << SerialPortInfo.manufacturer();
		qDebug() << "Serial Number: " << SerialPortInfo.serialNumber();//串口号
		qDebug() << "System Location: " << SerialPortInfo.systemLocation();//系统位置
	}
	else {
		qDebug() << "串口信息未找到,请检查设备是否连接";
	}

	serial->setBaudRate(QSerialPort::Baud9600);//设置串口波特率(9600)
	serial->setDataBits(QSerialPort::Data8);//设置数据位(8)
	serial->setParity(QSerialPort::NoParity); //设置奇偶校检(无)
	serial->setStopBits(QSerialPort::OneStop);//设置停止位(一位)
	serial->setFlowControl(QSerialPort::NoFlowControl);//设置流控制(无)

	serial->open(QIODevice::ReadOnly);//打开串口,并设置串口为只读模式
	if (serial->isOpen())
		qDebug() << "串口已经打开";
	connect(serial, SIGNAL(readyRead()), this, SLOT(slot_read_from_port()));
}

二、解析数据

因为串口每次读取不定长的字符,因此需要对每一条GPS数据进行拼接,遇到回车符\n拼接结束,进行解析。

cpp 复制代码
void serialPort::slot_read_from_port() {
	QByteArray  byteArray = serial->readAll();
	lineData.append(byteArray);
	if (lineData.contains('\n'))//只有等到\n的时候才能进入
	{
		QString lineQstring = QString::fromLocal8Bit(lineData);
		qDebug() << "lineQstring: " << lineQstring;
		QString parseName = "GNGGA";
		//解析GPGGA数据
		if (lineQstring.contains(parseName)) { //如果解析北斗数据,换为 BDGGA   格洛纳斯:GLGGA
			//qDebug()<<"parse data: " << lineQstring;
			//通过逗号分割数据
			QList<QString>d = lineQstring.split(',');
			/*
			(1)UTC时间,格式为hhmmss.ss;
			(2)纬度,格式为ddmm.mmmmm(度分格式);
			(3)纬度半球,N或S(北纬或南纬);
			(4)经度,格式为dddmm.mmmmm(度分格式);
			(5)经度半球,E或W(东经或西经);
			(9) 海拔高度(-9999.9~99999.9)
			*/
			//时间转为秒
			_flyData.time = d[1].mid(0, 2).toInt() * 60 * 60 + d[1].mid(2, 2).toInt() * 60 + d[1].mid(4, 2).toInt();
			//纬度
			if (d[3] == "N") {
				_flyData.lat = parseLngLat(d[2].toDouble());
			}
			else if (d[3] == "S") {
				_flyData.lat = -parseLngLat(d[2].toDouble());
			}
			//经度
			if (d[5] == "E") {
				_flyData.lng = parseLngLat(d[4].toDouble());
			}
			else if (d[5] == "W") {
				_flyData.lng = -parseLngLat(d[4].toDouble());
			}
			//高度
			_flyData.alt = d[9].toDouble();
			//qDebug() << d[1] << "  " << _flyData.lng << "  " << _flyData.lat << "  " << _flyData.alt;
		}

		lineData.clear();
	}

}

//解析经纬度至小数
double serialPort::parseLngLat(double LL) { //例如:4546.40891 
	//度
	int d = int(LL / 100);
	int m = int(LL - d * 100);
	double s = ((LL - d * 100) - m) * 60;
	//组合为小数
	return (d + m / 60.0 + s / 3600.0);
}
相关推荐
计算机内卷的N天7 分钟前
UI样式表(悬停hover状态样式和按下pressed)
qt
fmdpenny28 分钟前
Vue3初学之商品的增,删,改功能
开发语言·javascript·vue.js
涛ing42 分钟前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
黄金小码农1 小时前
C语言二级 2025/1/20 周一
c语言·开发语言·算法
萧若岚1 小时前
Elixir语言的Web开发
开发语言·后端·golang
wave_sky2 小时前
解决使用code命令时的bash: code: command not found问题
开发语言·bash
水银嘻嘻2 小时前
【Mac】Python相关知识经验
开发语言·python·macos
ac-er88882 小时前
Yii框架中的多语言支持:如何实现国际化
android·开发语言·php
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享