2016-03-03 115 views
0

我有一個相當令人沮喪的問題,我很新的到Python /樹莓派pySerial緩衝GPSD座標上樹莓派

我有一個腳本,是相匹配的GPS與過濾iwlist掃描SSID座標和然後發送電子郵件生成的文件,只要有wifi連接。

我的問題是,結果被連續緩衝,所以GPS座標可能會遠離掃描的SSID。

我在while循環的開始處刷新了串行線,但它似乎不起作用。我也有python運行un-buffered(-u,但這可能只是爲了文本文件..)我添加了Output.flush(),但我還沒有能夠測試它。我想先問一下。

所以,我的問題是,有沒有辦法關閉串行線緩衝區,所以每次迭代都會在while循環執行時獲得GPS座標?我寫的所有文本文件都有file.flush()。這是否需要在寫入文件之前進行,否則不會影響串行緩衝區?我錯過了什麼?

任何幫助,將不勝感激

#!/usr/bin/python -u 
import os 
import gps 
import time 
import serial 
import smtplib 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email import Encoders 

username = 'gmail account' 
password = 'account password' 

port = serial.Serial("/dev/ttyAMA0", baudrate=9600) 

#Setting GPS session, listen on port 2947 (gpsd) of localhost 
session = gps.gps("localhost", "2947") 
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) 

#Begin GPS and WiFi Scan loop.. 
while True: 

    try: 
     port.flushInput() 
     #port.flushOutput() commented out because I haven't tested with this yet. 
     time.sleep(.5) 
     report = session.next() 
     #Uncomment below for report data 
     #print report 
     if report['class'] == 'TPV': 
      if hasattr(report, 'lat' and 'lon'): 
       #setting GPS variables and strings 
       latitude = report.lat 
       latString = "%f" %(latitude) 
       longitude = report.lon 
       lonString = "%f" %(longitude) 

     #WiFi scan and parse script. I don't think it is necessary to post,  
     #but if it is, I will. All text files are flushed before being closed 

     #Email when connected 
     ping = os.system('sudo ping -c4 8.8.8.8') 
     try: 
      if ping == 0: 
       msg = MIMEMultipart() 
       msg['Subject'] = "GPS/WiFi data from GPS PILOT" 
       msg['From'] = username 
       msg['To'] = username 

       body = "GPS/WiFi data attached.." 

       msg.attach(MIMEText(body, 'plain')) 
       part = MIMEBase('application', "octet-stream") 
       part.set_payload(open("/home/pi/gpsMaster/dataLog.csv", "rb").read()) 
       Encoders.encode_base64(part) 
       part.add_header('Content-Disposition', 'attachment; filename="GPSWiFi_Scan.csv"') 

       msg.attach(part) 

       server = smtplib.SMTP('smtp.gmail.com:587') 
       server.ehlo() 
       server.starttls() 
       server.login(username, password) 
       server.sendmail(username, username, msg.as_string()) 
       server.quit() 
       os.system("sudo rm /home/pi/gpsMaster/dataLog.csv") 
      else: 
       pass 

     except smtplib.SMTPException: 
      os.system('sudo reboot now') 

      #Adding loop delay 
      time.sleep(10) 

    #Loop ending exceptions    
    except KeyError: 
     pass 
    except IOError: 
     print ("ERROR") 
     #os.system('sudo reboot now') 
    except KeyboardInterrupt: 
     quit() 
    except StopIteration: 
     session = None 
     os.system("sudo reboot now") 
+0

你爲什麼要刷這個端口,而'/ dev/ttyAMA0'和你的gps一樣? – Nodak

+0

@Nodak我正在刷新端口以嘗試獲取最新的GPS座標,而不是從緩衝區中取出一個。假設,如果我每英里駕駛5英里的目標SSID,在行程結束時,腳本會在行程開始附近繪製座標(取決於緩衝區的大小)。/dev/ttyAMA0是GPS所在的端口,通過輸入命令'cgps -s',我可以看到當前讀數。 – sjo91190

+0

GPSD處理設備。它不共享設備。它共享數據。你只是想從gpsd流中提取數據。 – Nodak

回答

2

我有一個類似的問題。我通過沖洗輸入和輸出來修復。

port.flushInput() 
port.flushOutput()