Python serial、pynmea2的使用

代码作用:
使用serial、pynmea2实现python对串口的GPS模块的NMEA数据进行解析。

import serial
import pynmea2
 
ser = serial.Serial('COM4', 9600, timeout=0.2)
 
while True:
    try:
        recv = ser.readline().decode()
        if recv.startswith('$'):
            record = pynmea2.parse(recv)
            if recv.startswith('$GPRMC') or recv.startswith('$GNRMC'):
                print('--------------------------------')
                print('Fix Status: ', record.status)
                #print('Latitude: ', record.latitude)
                #print('Longitude: ', record.longitude)
            elif recv.startswith('$GPGGA') or recv.startswith('$GNGGA'):
                print('Number of Satellites availabe:', record.num_sats)
            elif recv.startswith('$GPGSV') or recv.startswith('$BDGSV') or recv.startswith('$GBGSV') or recv.startswith('$GLGSV'):
                if record.msg_num =='1':
                    print('Number of Satellites in View:', record.num_sv_in_view)
                print("Satallites No.:  GROUP", record.msg_num+'    ','['+record.sv_prn_num_1+':'+record.snr_1+']', '['+record.sv_prn_num_2+':'+record.snr_2+']', '['+record.sv_prn_num_3+':'+record.snr_3+']', '['+record.sv_prn_num_4+':'+record.snr_4+']')
                #print("Satallites CN0: ", record.snr_1, record.snr_2, record.snr_3, record.snr_4)
            elif recv.startswith('$GPGSA') or recv.startswith('$BDGSA') or recv.startswith('$GNGSA'):
                    print('Fixed Satellites No.: ', record.sv_id01, record.sv_id02, record.sv_id03, record.sv_id04,record.sv_id05, record.sv_id06,record.sv_id07, record.sv_id08,record.sv_id09, record.sv_id10,record.sv_id11, record.sv_id12)
    except pynmea2.nmea.ParseError:
        print('NMEA wrong!')

 


---------------------
作者:梅博
来源:CSDN
原文:https://blog.csdn.net/weixin_43912513/article/details/100058616
版权声明:本文为作者原创文章,转载请附上博文链接!

 

# 读取arduino串口数据并保存
import serial
import pandas as pd

# sets up serial connection (make sure baud rate is correct - matches Arduino)
# 设置串口号和波特率和Arduino匹配
ser = serial.Serial('com6', 9600)
# a为储存数据的列表
a = []
# count为次数,采集多少次就停止
count = 0
while count != 30:  # 30可以根据需要设置,while(True):代表一直读下去
    # reads until it gets a carriage return. MAKE SURE THERE IS A CARRIAGE RETURN OR IT READS FOREVER
    data = ser.readline()  # 按行读取串口数据进来
    data = data.decode()  # 读进来的数据是bytes形式,需要转化为字符串格式
    data = data[13:30]  # 数据格式是'Orientation: 180.87 2.16 -3.86\r\n',取第13到29为字符出来就是-->'180.87 2.16 -3.86'
    data = data.split(" ")  # 以空格为分隔符分隔字符串-->['180.87', '2.16', '-3.86']
    count += 1
    data = list(map(float, data))  # 把字符串转化为数字-->[180.87, 2.16, -3.86]
    print(data)
    a.append(data)  # 添加到列表里

df = pd.DataFrame(a)  # 转化为df格式数据
# print(df)
df.to_excel('D:\桌面文件\\bp\\angle.xls', header=False, index=False)

#coding=utf-8
import serial
ser=serial.Serial()
ser.port=0
ser.baudrate=4800
ser.open()
while True:
        line=ser.readline()
        if line.startswith('$GPGLL,'):
                st=line.split(',')#0,‘$GPGLL’;1,维度;2,南北半球;3,经度;4,东西经;5,时间
                print st[5],st[4],st[3],st[2],st[1]
        print line,
ser.close()
————————————————
版权声明:本文为CSDN博主「weizhe86」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weizhe86/article/details/4210707
#把度秒转成小数
def parse_loc_val(val, d):
    v = float(val)/100
    v = int(v) + (v-int(v))*100/60
    if d=='S' or d=='W':
        v = v * -1
    return v
#获取经纬度信息
def parse_gprmc(data):
    '''
    b'$GPRMC,111025.00,A,2517.033747,N,11019.176025,E,0.0,144.8,270920,2.3,W,A*2D\r\n'
    b'$GPRMC,,V,,,,,,,,,,N*53\r\n'
    b'$GPRMC,024443.0,A,2517.038296,N,11019.174048,E,0.0,,120201,0.0,E,A*2F\r\n'
    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF> 
    <1> UTC时间,hhmmss(时分秒)格式 
    <2> 定位状态,A=有效定位,V=无效定位 
    <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
    <4> 纬度半球N(北半球)或S(南半球) 
    <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
    <6> 经度半球E(东经)或W(西经)
    <7> 地面速率(000.0~999.9节,前面的0也将被传输) 1节=1.852千米(km/h)
    <8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输) 
    <9> UTC日期,ddmmyy(日月年)格式 
    <10> 磁偏角(000.0~180.0度,前面的0也将被传输) 
    <11> 磁偏角方向,E(东)或W(西) 
    <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
    '''
    li = data.decode().replace('$GPRMC,', '').strip().split(',')
    lat=log=speed=direct=0
    if li[1] == 'A':
        lat = round(parse_loc_val(li[2], li[3]), 6)   #纬度
        log = round(parse_loc_val(li[4], li[5]), 6)   #经度
        speed = float(li[6]) * 1.852
        if len(li[7])>0:
            direct = float(li[7])
        else:
            direct = 0
        #logging.info('lat:{:.6f},log:{:.6f},speed:{},direct:{}'.format(lat, log, speed, direct))
    return (lat,log,speed, direct)
import serial

port_list = list(serial.tools.list_ports.comports())	# 获取当前可用的串口列表

serialPort = "COM4"		# 定义/设置串口名称(在‘我的电脑’设备管理器中可以查到)
baudRate = 9600			# 定义/设置串口波特率(要确保和设备的波特率相同)
timeout = 1				# 定义/设置超时时间(单位:s)

ser = serial.Serial(serialPort, baudRate, timeout)
# 当然,这样也可以:ser=serial.Serial("COM4", 9600, 1)

string = ser.readline().decode('utf-8')	# 读取一列数据
str_lines = ser.readlines()				# 读取所有数据


---------------------
作者:梅博
来源:CSDN
原文:https://blog.csdn.net/weixin_43912513/article/details/100058616
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值