【问题标题】:Reading form a serial input does not work in Python3从串行输入中读取在 Python3 中不起作用
【发布时间】:2020-01-01 15:41:42
【问题描述】:

我无法让 Python2.7 中的简单脚本在 Python3 中正常工作。 脚本:

enter code here{
#!/usr/bin/env python
# simple test program to test serial I/O data from gps 
# 
# Dec 2019 HRK

import Adafruit_BBIO.UART as UART
import serial

UART.setup("UART2")

ser2 = serial.Serial('/dev/ttyO2', timeout=2)

def parseGPS(gps_data):
    if gps_data[0:6] == "$GNRMC":
        sdata=gps_data.split(",")
        if sdata[2] == 'V':
            print("Sat data not valid")
            return
        print("Parsing GNRMC data")
        time=sdata[1][0:2]+":"+sdata[1][2:4]+":"+sdata[1][4:6]
        lat=decode(sdata[3])
        dirlat=sdata[4]
        lon=decode(sdata[5])
        dirlon=sdata[6]
        print('GMT: {} lat: {}{} long: {}{}'.format(time, lat, dirlat, lon, dirlon))

def decode(coord):
    # converts dddmm.mmmmm > DD deg MM.MMMMM min
    x = coord.split(".")
    head = x[0]
    tail = x[1]
    tail = tail[0:2]
    deg = head[0:-2]
    min = head[-2:]
    return deg + ":" + min + "." + tail

print("receiving GPS data")
while True:
    data = ser2.readline()
    parseGPS(data)    
    }

Python2 给出了预期的响应。 Python3 在打印后停止(“接收 GPS 数据”)。 我知道两个 Python 版本中的串行差异,但谷歌搜索并没有为我带来解决方案。问题可能是 ser2.readline() 语句。 请指教。
提前致谢, 哈克

【问题讨论】:

    标签: python pyserial


    【解决方案1】:

    当你初始化“ser2”时,你会让很多东西保持默认。
    尝试设置更多参数以确保它们正确。
    我将尝试重新创建错误并在我回家时帮助您获取一些工作代码
    示例取自这篇文章
    Python Serial: How to use the read or readline function to read more than 1 character at a time

    serial.Serial( port='COM5',\
                   baudrate=9600,\ 
                   parity=serial.PARITY_NONE,\
                   stopbits=serial.STOPBITS_ONE,\
                   bytesize=serial.EIGHTBITS,\
                   timeout=0)
    

    另见这篇文章

    pySerial differences with python 2.7 and 3.4

    【讨论】:

    • 谢谢罗恩。声明所有串行 pars 无效。我也试过:str(ser2.readline()),也无济于事。看起来 ser2.readline() 正在等待某些东西。 uBlox 的 NMEA 协议将 CR/LF 指定为行终止符。我最好的,
    • 记录一下:我想我找到了罪魁祸首:不是 readline() 语句,而是 ParseGPS 中的第一个 if 语句。它应该是:如果 gps_data 中的“GNRMC”:。我在 Pyhton3 提示符下通过手动模拟发现了这一点。并不是说我了解机制....
    • 不幸的是,这还没有结束。另一个具有相同版本 Debian 的 Beaglebone 上的相同脚本无法运行。 readline 语句中没有任何反应。当我在 Python3 提示符下手动输入相关语句时,我会收到 gps 数据,尽管它比预期的要旧一些。我清除了缓冲区,这有帮助,但只是旧数据。重新启动等无济于事。可能是什么原因?任何想法@ron?
    • 已经解决了。不同的 GPS 接收器提供不同的数据集。我一直在寻找 $GNRMC 而 $GPRMC 更常见。这样你可以等待很长时间......通过从 Debian/Linux 命令提示符配置 UART 引脚并将结果转储到屏幕来发现。
    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2013-08-22
    • 2021-11-08
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多