Python 3.x 如何将微控制器连接到gps模块并接收位置信息
我正在尝试用物联网做一个小项目。 该项目包括一个带有微控制器(开源)和显示器的公共汽车站。 此外,一个微控制器(开源),带有GPS模块作为总线 这是我们从toptechboy修改的代码Python 3.x 如何将微控制器连接到gps模块并接收位置信息,python-3.x,Python 3.x,我正在尝试用物联网做一个小项目。 该项目包括一个带有微控制器(开源)和显示器的公共汽车站。 此外,一个微控制器(开源),带有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, Request
#!/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'
回溯(最近一次呼叫最后一次):
文件“m.py”,第83行,在
myGPS=GPS()
文件“m.py”,第29行,在_init中__
序列写入(波特率为57600)
写入文件“/home/debian/.local/lib/python3.5/site packages/serial/serialposix.py”,第532行
d=到字节(数据)
文件“/home/debian/.local/lib/python3.5/site packages/serial/serialutil.py”,第63行,以字节为单位
raise TypeError('不支持unicode字符串,请编码为字节:{!r}'。格式(seq))
TypeError:不支持unicode字符串,请将其编码为字节:'$PMTK25157600*2C\r\n'
我希望微控制器1充当gps并创建变量,然后将它们发送给微控制器2,这样微控制器2将显示总线运行位置的实时地图。您正在尝试在Python 3.x上运行为Python 2.x编写的代码 您可能知道,这两者之间的关键区别之一是Python3.x对字符串使用Unicode(有关更多详细信息,请参阅) 您有两种选择:使用Python2.x运行或移植代码。如果您选择第二种方式,唯一的变化(乍一看,您可能需要其他次要的东西)是在将命令写入端口之前对其进行编码,例如,使用:
ser.write(BAUD_57600.encode())
而不是您的ser.write(波特率)