2016-06-13 34 views
-1

Arduino SoftwareSerialライブラリを使用してシリアルデータをRdbberryピンに送信しています。私はArduinoのシリアルデータをRaspberryに正常に送信することができます。送信した整数が文字列に相当するものとして到着するだけです。Python readline()は、int型またはfloat型に変換されない文字列を返します。

問題:私は.readlineは()のfloatまたはint型に返すことに文字列を変換しようとしていますが、私はそうすることができません

import serial 
oSer = serial.Serial("/dev/ttyAMA0",baudrate=57600,timeout=1) 

while True: 
    sInput = oSer.readline() 
    print sInput #Returns: >>1,2,3, 

    lsInput = sInput.split(',') 
    print lsInput #Returns: >>['1','2','3','\r\n'] 

これをintまたはfloatに変換するにはどうすればよいですか?私は単純に数を使って算術演算を行う必要があります。私が試してみました:

lfInput = [float(i) for i in lsInput] #Returns: >> ValueError: could not convert to float: 

    liInput = [int(i) for i in lsInput] #Returns: >> ValueError: invalid literal for int() with base 10: '' 

回答回答を提供ジョンとパドレイクに

おかげで、私は上記の問題を解決する方法についての更新を確認することができます。私はPadraicのソリューションを好みますが、ややエレガントですが、いずれかの作業を行います。私は、次を追加しました:

ジョンの、特にパッドのソリューション(より良く、より詳細については、下記の回答を参照してください):

sInput = oSer.readline().strip() #but see answers below from Pad for more detail 
+0

末尾の '、'は一貫していますか? –

+0

3つ以上の番号を取得するとどうなりますか? –

+0

マーク:末尾の「カンマ」私は故意にArduinoのスケッチに入れて、後に続く「\ r \ n」という用語を分けます。そのコンマはもはや必要ではありません。 – Misha

答えて

2

エラーは\r\nの最後にライン。 int()float()はそれが好きではありません。

あなたがそうのようにそれを取り除くことができ、次のいずれか

sInput = oSer.readline().strip() 

それとも、非数字を無視するようにループを変更することができます。

liInput = [int(i) for i in lsInput if i.isdigit()] 
+0

こんにちはジョン。これは優れたソリューションのおかげです。非常にエレガントなストリップの方法でそれをやっている。ありがとうミルズの男!多くの賛成を受けました – Misha

+0

'int'と' float'は空白を無視します。 '\ r \ n 'に問題があるわけではありません。少なくとも1桁は必要です。入力には末尾にカンマがあるので、 'split'は数字を全く含んでいない文字列を残します。 'int(" 1 \ r \ n ")'はうまく動作し、失敗した 'int(" \ r \ n ")'です。 – ShadowRanger

-2

あなたがやって試すことができます:

、B、C = IsInput

おそらく整数値が別々の変数に抽出されます。

+0

値が4,5,6の場合はどうなりますか? –

+0

次に、3つの代わりにもっと多くの変数を使用する必要があります –

1

あなたは末尾の空白rstripことができます。

while True: 
    sInput = oSer.readline().rstrip().split(",") 

または、より堅牢なアプローチは、要素がtry/excepを使用してfloatにキャストできるかどうかを確認することですT:

def cast(it): 
    for ele in it: 
     try: 
      yield float(ele) 
     except ValueError: 
      pass 


while True: 
    sInput = oSer.readline().rstrip(",\r\n").split(",") 
    nums = list(cast(sInput.split(","))) 

castは山車、int型と負の数のために動作します。

+0

ありがとうパドレイク、私はこれを試してみましょう。 – Misha

+0

@Misha、* isdigit *は、正の整数、 '' 1.0 ".isdigit() - > False'、' "-1" .isdigit() - > False'の場合にのみ機能します。負の数や浮動小数点数を持つ場合は十分です。 –

+1

私は負の数は決してありませんが、それは私のモデルをより良いものに拡大すべきではありません。ありがとう – Misha

関連する問題