python-3.x - 如何将微控制器连接到 GPS 模块并接收位置
问题描述
我正在尝试使用物联网做一个小项目。该项目包括一个带有微控制器(开源)的巴士站和一个显示器。此外,还有一个带有 GPS 模块作为总线的微控制器(开源)。
这是我们从 toptechboy 修改的代码
#!/usr/bin/python
import serial
import Adafruit_BBIO.UART as UART
import Adafruit_BBIO.GPIO as GPIO
import time
from Adafruit_IO import Client, Feed, RequestError
ADAFRUIT_IO_KEY ='*********'
ADAFRUIT_IO_USERNAME ='********'
aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)
digital = aio.feeds('eproject')
GPIO.setup("P8_8", GPIO.OUT)
UART.setup("UART1")
ser=serial.Serial('/dev/ttyO1',9600)
class GPS:
def __init__(self):
UPDATE_10_sec= "$PMTK220,10000*2F\r\n" #Update Every 10 Seconds
UPDATE_5_sec= "$PMTK220,5000*1B\r\n" #Update Every 5 Seconds$
UPDATE_1_sec= "$PMTK220,1000*1F\r\n" #Update Every One Second
UPDATE_200_msec= "$PMTK220,200*2C\r\n" #Update Every 200 Milli$
#This set is used to set the rate the GPS takes measurements
MEAS_10_sec = "$PMTK300,10000,0,0,0,0*2C\r\n" #Measure every 10$
MEAS_5_sec = "$PMTK300,5000,0,0,0,0*18\r\n" #Measure every 5 $
MEAS_1_sec = "$PMTK300,1000,0,0,0,0*1C\r\n" #Measure once a s$
MEAS_200_msec= "$PMTK300,200,0,0,0,0*2F\r\n" #Meaure 5 times a$
#Set the Baud Rate of GPS
BAUD_57600 = "$PMTK251,57600*2C\r\n" #Set Baud Rate at$
BAUD_9600 ="$PMTK251,9600*17\r\n" #Set 9600 Baud Ra$
#Commands for which NMEA Sentences are sent
ser.write(BAUD_57600)
time.sleep(1)
ser.baudrate=57600
GPRMC_ONLY= "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\$
GPRMC_GPGGA="$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\$
SEND_ALL ="$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\$
SEND_NOTHING="$PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28$
ser.write(UPDATE_200_msec)
time.sleep(1)
ser.write(MEAS_200_msec)
time.sleep(1)
ser.write(GPRMC_GPGGA)
time.sleep(1)
ser.flushInput()
ser.flushInput()
print ("GPS Initialized")
def read(self):
ser.flushInput()
ser.flushInput()
while ser.inWaiting()==0:
pass
self.NMEA1=ser.readline()
while ser.inWaiting()==0:
pass
self.NMEA2=ser.readline()
NMEA1_array=self.NMEA1.split(',')
NMEA2_array=self.NMEA2.split(',')
if NMEA1_array[0]=='$GPRMC':
self.timeUTC=NMEA1_array[1][:-8]+':'+NMEA1_array[1][-8:$
self.latDeg=NMEA1_array[3][:-7]
self.latMin=NMEA1_array[3][-7:]
self.latHem=NMEA1_array[4]
self.lonDeg=NMEA1_array[5][:-7]
self.lonMin=NMEA1_array[5][-7:]
self.lonHem=NMEA1_array[6]
self.knots=NMEA1_array[7]
if NMEA1_array[0]=='$GPGGA':
self.fix=NMEA1_array[6]
self.altitude=NMEA1_array[9]
self.sats=NMEA1_array[7]
if NMEA2_array[0]=='$GPRMC':
self.timeUTC=NMEA2_array[1][:-8]+':'+NMEA1_array[1][-8:$
self.latDeg=NMEA2_array[3][:-7]
self.latMin=NMEA2_array[3][-7:]
self.latHem=NMEA2_array[4]
self.lonDeg=NMEA2_array[5][:-7]
self.lonMin=NMEA2_array[5][-7:]
self.lonHem=NMEA2_array[6]
self.knots=NMEA2_array[7]
if NMEA2_array[0]=='$GPGGA':
self.fix=NMEA2_array[6]
self.altitude=NMEA2_array[9]
self.sats=NMEA2_array[7]
myGPS=GPS()
while True:
data = aio.receive(digital.key)
myGPS.read()
print (m print (myGPS.NMEA2)
if int(data.value) == 1:
print('received ON \n')
GPIO.output("P8_8", GPIO.HIGH)
if myGPS.fix!=0:
print ('Universal Time: ',myGPS.timeUTC)
print ('You are Tracking: ',myGPS.sats,' satellites')
print ('My Latitude: ',myGPS.latDeg, 'Degrees ', myGPS.latMin,' minutes ', myGPS.latHem)
print ('My Longitude: ',myGPS.lonDeg, 'Degrees ', myGPS.lonMin,' minutes ', myGPS.lonHem)
print ('My Speed: ', myGPS.knots)
print ('My Altitude: ',myGPS.altitude)
elif int(data.value) == 0:
print('received OFF \n')
GPIO.output("P8_8", GPIO.LOW)
这是代码错误消息
Traceback (most recent call last):
File "m.py", line 83, in <module>
myGPS=GPS()
File "m.py", line 29, in __init__
ser.write(BAUD_57600)
File "/home/debian/.local/lib/python3.5/site-packages/serial/serialposix.py", line 532, in write
d = to_bytes(data)
File "/home/debian/.local/lib/python3.5/site-packages/serial/serialutil.py", line 63, in to_bytes
raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: '$PMTK251,57600*2C\r\n'
我希望微控制器 1 充当 gps 并创建变量,然后将它们发送到微控制器 2,因此微控制器 2 将显示公交车去向的实时地图。
解决方案
您正在尝试在 Python 3.x 上运行为 Python 2.x 编写的代码。
您可能知道,它们之间的主要区别之一是 Python 3.x 对字符串使用 Unicode(有关更多详细信息,请参见此处)。
您有两个选择:使用 Python 2.x 运行或移植代码。如果您选择第二个,唯一的变化(乍一看,您可能需要其他小东西)是在将命令写入端口之前对其进行编码,例如,使用:
ser.write(BAUD_57600.encode())
而不是你的ser.write(BAUD_57600)
推荐阅读
- amazon-web-services - 在 Node 中查找与已知公共 IP 地址关联的 EC2 资源 ID
- python - 出现错误:AttributeError: 'Node' object has no attribute 'output_masks' at flatten layer 用于展平嵌入输出
- c# - EFCore 跟踪记录状态:IsNew/IsLoaded
- node.js - NodeJs/Express Puppeteer 启动本地视图
- android - 如何更改编辑文本的选择颜色?
- azure - 数据工厂 DevOps SSIS-IntegrationRuntime
- prometheus - 获取prometheus标签的因变量
- r - 如何在一个数据框中找到唯一值并使用它来过滤 R 中的另一个数据框
- java - 如果列表是另一个列表的子集,则 Ebean 返回记录
- ruby-on-rails - 如果用户之前选择了单选按钮,如何在 Rails App 中将单选按钮添加回表单