QT读取GPS信息,信息组包,防止异常错乱

8 篇文章 0 订阅

以下如果有错误,请留言指正;

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;
}

已过有问题 可以留言哦,共同学习~~~

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值