質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7805閲覧

startswith first arg must be bytes or a tuple of bytes, not strの解決方法

kuryu

総合スコア13

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/22 08:24

編集2019/02/22 09:13

前提・実現したいこと

GPSセンサで座標を取得するプログラムを作成

発生している問題・エラーメッセージ

座標を取得できるようにエラーを解決したい。
具体的な指示をお願いしたいです。

Traceback (most recent call last):
File "/home/pi/wpi3_GPS.py", line 53, in <module>
if (gps_data.startswith('$GPGGA')): #startswith:1行の先頭文字を検索する
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

該当のソースコード

python

1#!/usr/local/bin/python 2# -*- coding: utf-8 -*- 3 4import serial 5import datetime 6import os 7 8ser = serial.Serial( #みちびき対応GPS用の設定 9 port = "/dev/ttyS0", #シリアル通信を用いる 10 baudrate = 9600, #baudレート 11 parity = serial.PARITY_NONE, #パリティ 12 bytesize = serial.EIGHTBITS, #データのビット数 13 stopbits = serial.STOPBITS_ONE, #ストップビット数 14 timeout = None, #タイムアウト値 15 xonxoff = 0, #ソフトウェアフロー制御 16 rtscts = 0, #RTS/CTSフロー制御 17 ) 18 19#後で使う変数をあらかじめ宣言 20alt_lat_long = '0,0,0' #GPSから得られる、高度、緯度、経度の情報 21num_sat = '0' #GPSから得られる、衛星の個数の情報 22 23def sixty_to_ten(x): 24 ans = float(int(x) + ((x - int(x)))*100/60) 25 return ans 26 27#GGA用のファイル初期化 28f = open('datagga.csv','w') 29f.write('yyyy-mm-dd HH:MM:SS.ffffff ,a number of satellites ,high ,latitude ,longitude \n') #出力フォーマット 30f.close() 31 32#GSV用のファイル初期化 33f = open('datagsv.csv','w') 34f.write('No. ,Elevation in degrees ,degrees in true north \n') #仰角と方位角 35f.close() 36 37now = datetime.datetime.now() 38if os.path.exists("datagga.csv"): 39 new_name = "{0}_{1:%Y%m%d-%H%M%S}.{2}".format("datagga",now,"csv") 40 os.rename("datagga.csv",new_name) 41 42#出力フォーマット 43print ("yyyy-mm-dd HH:MM:SS.ffffff ,a number of satellites ,high ,latitude ,longitude") 44print ("No. ,Elevation in degrees ,degrees in true north \n") 45############################################################################## 46while True: 47 gps_data = ser.readline() #1行ごとに読み込み、処理を繰り返す 48 if not gps_data: 49 print("no data") 50 #GGA GPSセンサの位置情報を知る 51 #$GPGGA,UTC時刻,緯度,緯度の南北,経度,経度の東西,位置特定品質,使用衛星数, 52 #水平精度低下率,海抜高さ,高さの単位,ジオイド高さ,高さの単位,DGPS,差動基準地点 53 if (gps_data.startswith('$GPGGA')): #startswith:1行の先頭文字を検索する 54 gpgga = (gps_data.split(",")) #split:1行をカンマで区切って変数にlist型で保存 55 #緯度と経度の情報を、listからfloatに直す 56 if gpgga[2]: 57 lat_60,long_60,altitude = float(gpgga[2]),float(gpgga[4]),float(gpgga[9]) 58 else: 59 lat_60,long_60,altitude = 0,0,0 #緯度の情報が無い 60 #緯度と経度を60進法から10進法に変換、東経と北緯で計算 61 if gpgga[3] == "W": lat_60 *= -1 62 if gpgga[5] == "S": long_60 *= -1 63 lat_10,long_10 = sixty_to_ten(lat_60/100),sixty_to_ten(long_60/100) 64 #csv形式で出力する用のデータを変数にまとめて保存する(なければ0とする) 65 alt_lat_long = "%3.2f,%5.6f,%5.6f" % (altitude,lat_10,long_10) if gpgga[9] else "0,0,0" #高度、緯度、経度 66############### 67 #GSA 特定タイプを見ることでGPSの通信状況を確認する 68 #$GPGSA,UTC時刻,特定タイプ,衛星番号,精度低下率(位置、水平、垂直) 69 #if (gps_data.startswith('$GPGSA')): print gps_data, #特定タイプ(2D,3D等)を確認するために表示。3の時が良好。 70############### 71 #GSV 受信した衛星の位置等の情報を記録する 72 #$GPGSV,UTC時刻,総センテンス数,このセンテンスの番号,総衛星数, 73 #衛星番号,衛星仰角,衛星方位角,キャリア/ノイズ比, を繰り返す 74 if (gps_data.startswith('$GPGSV')): 75 f = open('datagsv.csv','a') 76 gpgsv = (gps_data.split(',')) 77 #衛星の個数を記録し、情報を追加する 78 if (gpgsv[2] == '1'): 79 num_sat = gpgsv[3] 80 f.write(gpgsv[1] + gpgsv[3] + '\n') 81 #それぞれの衛星の番号、仰角、方位角を追加する 82 if (len(gpgsv) == 4): num_sat = '0' 83 elif (len(gpgsv) >= 8): 84 gsv1 = gpgsv[4] + gpgsv[5] + gpgsv[6] #センテンス中一つ目の衛星 85 f.write(gsv1 + '\n') 86 if (len(gpgsv) >= 12): 87 gsv2 = gpgsv[8] + gpgsv[9] + gpgsv[10] #二つ目の衛星 88 f.write(gsv2 + '\n') 89 if (len(gpgsv) >= 16): 90 gsv3 = gpgsv[12] + gpgsv[13] + gpgsv[14] #三つ目の衛星 91 f.write(gsv3 + '\n') 92 if (len(gpgsv) == 20): 93 gsv4 = gpgsv[16] + gpgsv[17] + gpgsv[18] #四つ目の衛星 94 f.write(gsv4 + '\n') 95 f.close() 96############# 97 #ZDA NMEA出力における最後の行のため、時間を調べつつ一括ファイル出力する 98 #$GPZDA,UTC時刻(hhmmss.mm),日,月,西暦,時,分, 99 if (gps_data.startswith('$GPZDA')): 100 gpzda = (gps_data.split(",")) 101 #GPSで取得したUTCの日付を保存する 102 yyyymmddhhmmssff = datetime.datetime.strptime(gpzda[4] + '/' + gpzda[3] + '/' + gpzda[2] + ' ' + gpzda[1],"%Y/%m/%d %H%M%S.%f") 103 time_and_number = "%s,%s" % (yyyymmddhhmmssff,num_sat) 104 #ファイル名を書き換える 105 #GGAのデータを標準出力、加えてcsvファイルに出力 106 f = open(new_name,'a') 107 f.write(time_and_number + ',' + alt_lat_long + '\n') 108 print(time_and_number + ',' + alt_lat_long) 109 f.close() 110 111

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/02/22 08:58

startswith first arg must be bytes or a tuple of bytes って「具体的な指示」だと思いましたが。
guest

回答1

0

ベストアンサー

gps_databytes型で得られているので、strを引数に渡さないでね、というエラーになっています。

対処法としては、以下の2択になるかと。

python

1# 選択肢1 2# decodeして以後strとして取り扱う。 3# 質問のコードは基本的にstr前提で書かれている気がするので、他は変えないでいい。 4# ただしdecodeできるbytesなのかどうかは知らない 5gps_data = ser.readline().decode() 6 7# 選択肢2 8# bytesを引数に渡す 9# bytesのまま取り扱う場合は、以後のすべての箇所で同等の配慮をする必要があります。 10gps_data.startswith(b'$GPGGA')

投稿2019/02/22 09:04

編集2019/02/22 09:04
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuryu

2019/02/22 09:15

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問