10

PICボードの電圧を表すシリアルポートからバイトを取得します。しかし、上記のエラーメッセージが表示されるため、これらのバイト(文字列)を10進数に変換できません。これが関数です(実際、tkinterボタンに関連付けられています)

def channel8():
    ser.write(chr(0xFF))
    print "you have select channel8"
    x=ser.read(2)
    w=int(x, 16)
    print w
    print "Voltage on channel8 is:" , x

ValueError:ベース16のint()のリテラルが無効です:'\ x0e \ xa3'

def channel8():
    ser.write(chr(0xFF))
    print "you have select channel8"
    x=ser.read(2)
    z=struct.unpack("h", x)
    #w=int(z, 16)
    print z

そして私はこれを手に入れます:

チャネル8の電圧は次のとおりです:(28942、)

この値を取得した方法を説明していただけますか?何にも一致しません:D

4

1 に答える 1

12

structモジュールを使用して、バイナリ データを次のように展開する必要があると思います。

struct.unpack("h", x)

intは実際にはバイナリ データを操作するためのものではなく、次のような 16 進文字列を操作するためのものですEF1D

2 バイトのバイナリ データを受け取った場合、ライブラリでサポートされている数値表現には(h) と(H)x=ser.read(2)の 2 種類があります。関数は 2 つの引数を受け取ります。structshortunsigned shortstruct.unpack

  • 構造仕様 (書式文字の文字列)
  • バイナリデータ

アンパックされた値を持つタプルを返します(あなたの場合は1つのintのみ)。

w=int(x, 16)したがって、文字列をw = struct.unpack("h", x)[0]またはに変更する必要がありますw = struct.unpack("H", x)[0]。これはデータ型によって異なります。

于 2012-08-06T09:59:03.447 に答える