以下如果有错误,请留言指正;
GNRMC为双模定位:GPRMC + BD
读取$GNRMC经纬度信息; 含GPRMC;
处理类似$GNRMC,064401.65,A,3110.4706987,N”
"110.3568,E,0.604,243.2,30,0713,0.0,W,A*3E”或者$GNRMC信息一包不完整的情况,不然程序会偶发宕机;
工程.pro文件中需要添加如下库:
QT += serialport
头文件引用
头文件引用
#include <QSerialPort>
#include <QSerialPortInfo>
private slots:
void serialRead();
private:
QSerialPort serial;//串口实例
bool sFinished; //标记上一次GPS数据是否解析完成
QString GpsMsg ; //gps数据组包使用
private:
void gpsParse(QByteArray GPSBuffer);//gps解析函数
实现cpp
初始化过程,加入到你初始化方法即可
serialReadFinished = true; //标记上一次GPS数据是否解析完成
connect(&serial,SIGNAL(readyRead()),this,SLOT(serialRead())); //连接槽
QSerialPortInfo info;
QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
bool ifd = false;
foreach (info, infos) {
if(info.portName() == "COM1"){
ifd = true;
break; //你的串口号比如 COM1
}
}
if(true == ifd){//can find
ui->textBrowser1->append("串口打开成功");
serial.close();
serial.setPort(info);
serial.open(QIODevice::ReadWrite); //可以改成ReadOnly
serial.setBaudRate(9600);//波特率
// serial.setBaudRate(QSerialPort::Baud9600); //波特率
// serial.setDataBits(QSerialPort::Data8); //数据位
// serial.setParity(QSerialPort::NoParity); //无奇偶校验
// serial.setStopBits(QSerialPort::OneStop); //无停止位
// serial.setFlowControl(QSerialPort::NoFlowControl); //无控制
}else{
serial.close();
ui->textBrowser1->append("串口打开失败");
}
void MainWindow::serialRead()
{
QByteArray qa = serial.readAll();
gpsParse(qa);
}
void MainWindow::gpsParse(QByteArray GPSBuffer)
{
if(false == sFinished){
return;
}
sFinished= false;
QString GPSBufferString = QString( GPSBuffer );
//处理数据粘包过程 contains
if(GPSBufferString.startsWith("$GNRMC") || GPSBufferString.startsWith("$GPRMC") ){
GpsMsg = GPSBufferString;
}else{
if(!GpsMsg .isEmpty()){
GpsMsg = GpsMsg .append(GPSBufferString);
}
}
if((GPSBufferString.startsWith("$GNRMC") || GPSBufferString.startsWith("$GPRMC")) && (GpsMsg .count(",") >= 12 ) )
{
QByteArray bytes = GpsMsg .toUtf8();
//ui->textBrowser1->append("p0:"+bytes);
QList<QByteArray> gpsByteArrays = bytes.split(',');
// int count = gpsByteArrays.count();
if("V" == gpsByteArrays.at(2)){
qDebug() << "V invalid positioning ;";
}else{
int gpsLat_1 = static_cast<int>(gpsByteArrays.at(3).toDouble()/100);
double gpsLat_2 = (gpsByteArrays.at(3).toDouble() - gpsLat_1 * 100)/60;
double gpslat=gpsLat_1 + gpsLat_2;
int gpsLong_1 = static_cast<int>(gpsByteArrays.at(5).toDouble()/100);
double gpsLong_2 = (gpsByteArrays.at(5).toDouble()-gpsLong_1 * 100)/60;
double gpsLong = gpsLong_1 + gpsLong_2;
std::cout<<"经度:"<<QString::number(gpslat,'g',9)<<endl;
std::cout<<"维度:"<<QString::number(gpsLong,'g',10)<<endl;
if(!gpsByteArrays.at(8).isEmpty())
ui->textBrowser1->append("p4:" +gpsByteArrays.at(8));
}
GpsMsg = "";
}
sFinished = true;
}
已过有问题 可以留言哦,共同学习~~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)