GPS NMEA-0183 协议

本文详细解读了GPSNMEA-0183协议,特别是GPRMC部分,以及如何使用Python编程接收和处理串口中的NMEA数据,包括解析JSON格式信息。此外,还介绍了中科微AT6558R芯片的应用和串口通信技术。
摘要由CSDN通过智能技术生成

一文读懂 GPS NMEA-0183 协议 - 知乎

GPRMC

Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息

 $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh

各字段描述如下:

  • <1> UTC 时间,格式 hhmmss.ssss,代表时分秒.毫秒
  • <2> 定位状态,A=有效定位,V=无效定位
  • <3> 纬度 ddmm.mmmm(度分)格式(前面的 0 也将被传输)
  • <4> 纬度半球 N(北纬)或 S(南纬)
  • <5> 经度 dddmm.mmmm(度分)格式(前面的 0 也将被传输)
  • <6> 经度半球 E(东经)或 W(西经)
  • <7> 地面速率(000.0~999.9 节,前面的 0 也将被传输)
  • <8> 地面航向(方位角),等效于二维罗盘(000.0~359.9 度,以真北为参考基准,前面的 0 也将被传输)
  • <9> UTC 日期,DDMMYY(日月年)格式
  • <10> 磁偏角(000.0~180.0 度,前面的 0 也将被传输)
  • <11> 磁偏角方向,E(东)或 W(西)
  • <12> 模式指示(仅 NMEA0183 3.0 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
  • 最后两个字节是校验和

商品详情

SR1612Z2中科微AT6558R芯片GPS北斗双模高精授时测速导航定位模块

使用python接受串口数据

# 使用python串口库 接受串口数据


import serial
from time import sleep

def recv(serial):
    while True:
        data = serial.read_all().decode()  # str
        if data == '':
            continue
        else:
            break
        sleep(0.02)
    return data

if __name__ == '__main__':
    serial = serial.Serial('COM16', 115200, timeout=0.5)
    if serial.isOpen():
        print("serial open success")
    else:
        print("serial open failed")
    while True:
        data = recv(serial)
        print(data)  # str

=============================python+json========================

# -*- coding: utf-8 -*-
"""
Created on Thu Aug  5 08:43:36 2021

@author: huangcw
"""


import serial
import time
import json
from datetime import datetime
import threading

class SerialPort:
    def __init__(self, port, buand):
        self.data_bytes=bytearray()
        self.is_exit = False
        self.port = serial.Serial(port, buand)
        self.port.close()
        if not self.port.isOpen():
            self.port.open()

    def port_open(self):
        if not self.port.isOpen():
            self.port.open()

    def port_close(self):
        self.port.close()

    def send_data(self):
        self.port.write('')

    def read_data(self):
        """
        从串口读取数据,并放到缓冲区中
        """
        while not self.is_exit:
            count = self.port.inWaiting()
            if count > 0:
                rec_str = self.port.read(count)
                self.data_bytes=self.data_bytes+rec_str
    
    def frame_process(self):
        """
        提取json格式数据,若收到的数据中包含完整的json数据,每调用一次返回一条json数据。
        注意:仅支持一层 { }的json数据格式。
        """
        self.head = -1
        self.tail = -1
        self.head = self.data_bytes.find(b'{')
        self.tail = self.data_bytes.find(b'}')
        if(self.head != -1):  #有json的头
            if(self.tail != -1):    #有尾
                if(self.tail < self.head):  #尾靠前,说明前面不是一个完整的报文,需要扔掉
                    self.data_bytes[0:self.tail+1]=b''
                    return -2
                if(self.tail > self.head): # 有头有尾,且头在尾前面
                    self.rtn = self.data_bytes[self.head:self.tail+1]
                    self.data_bytes[self.head:self.tail+1]=b''
                    return self.rtn
            # 有头没有尾,说明还没有接收完一帧,不处理
            else:
                return -1
        # 没头,说明没接收到一帧,不处理
        else:
            return -1
                
serialPort = 'COM13'  # 串口
baudRate = 115200  # 波特率

if __name__ == '__main__':
    #打开串口
    mSerial = SerialPort(serialPort, baudRate)
        #开始数据读取线程
    t1 = threading.Thread(target=mSerial.read_data)
    t1.setDaemon(True)
    t1.start()
    frame_cnt = 0
    frame_error_cnt = 0
    try:
        while True:
            rtn = mSerial.frame_process()
            if rtn != -1 and rtn != -2:
                frame_cnt = frame_cnt + 1
                print("正确帧:{}  错误帧:{} 新数据:{}".format(frame_cnt,frame_error_cnt,rtn))
            elif rtn == -2:
                frame_error_cnt = frame_error_cnt +1
    except KeyboardInterrupt:
        if mSerial.port_open():
            mSerial.port_close()
            

# 参考了 Python接收串口数据 程序-CSDN博客

# 参考了 【python】python接收串口json格式数据并解析-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值