一文读懂 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 sleepdef recv(serial):while True:data = serial.read_all().decode() # strif data == '':continueelse:breaksleep(0.02)return dataif __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 threadingclass SerialPort:def __init__(self, port, buand):self.data_bytes=bytearray()self.is_exit = Falseself.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_strdef frame_process(self):"""提取json格式数据,若收到的数据中包含完整的json数据,每调用一次返回一条json数据。注意:仅支持一层 { }的json数据格式。"""self.head = -1self.tail = -1self.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 -2if(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 -1serialPort = 'COM13' # 串口
baudRate = 115200 # 波特率if __name__ == '__main__':#打开串口mSerial = SerialPort(serialPort, baudRate)#开始数据读取线程t1 = threading.Thread(target=mSerial.read_data)t1.setDaemon(True)t1.start()frame_cnt = 0frame_error_cnt = 0try:while True:rtn = mSerial.frame_process()if rtn != -1 and rtn != -2:frame_cnt = frame_cnt + 1print("正确帧:{} 错误帧:{} 新数据:{}".format(frame_cnt,frame_error_cnt,rtn))elif rtn == -2:frame_error_cnt = frame_error_cnt +1except KeyboardInterrupt:if mSerial.port_open():mSerial.port_close()
# 参考了 Python接收串口数据 程序-CSDN博客
# 参考了 【python】python接收串口json格式数据并解析-CSDN博客