0

これを投稿するための完全なツールのように感じます。これは非常に基本的なものであり、この問題で過去 2 日間を無駄にしたとは思えません。これで見つけられるすべての解決策を試しましたが(真剣に、インターネットの履歴をお見せします)、役に立ちませんでした. 問題は次のとおりです。

uC からのシリアル文字列を解析しています。長さは 52 バイトで、データのさまざまな変数が多数含まれています。パック 2 進化 10 進数でエンコードされたデータ。

元:.....blah.....0x01 0x5E .....blah

16 進数の 015E は 10 進数で 350 になります。これが私が望む価値です。シリアル文字列を問題なく読み取っています。binascii.hexifiy を使用してバイトを出力し、正しいことを確認しました。私が使う

data = ser.read()

改行が受信されない場合は、データを配列に配置します。配列をバイト配列、リスト、見つけることができるものにしようとしましたが、どれも機能しません。

必要な 2 バイト セクションを定義済みメソッドに送信したいと考えています。

def makeValue(highbyte, lowbyte)

アンパック、結合、パック、ビット操作、文字列集中を使用しようとすると、同じ問題が発生し続けます。

0x01 と 0x5E は有効な int 番号 (見出しの開始と ASCII の ^) ではないため、機能しません。有効な int ではないため、最初に数字を結合することさえできません。

using hex(): hex argument can't be converted to hex. Joining the strings: invalid literal for int() with base 16: '\x01^' using int: invalid literal for int() with base 10: '\x01^' Packing a struct: struct.error: cannot convert argument to integer

真剣に、ここで本当に基本的な何かが欠けていますか? 私が見つけることができるすべての例は、上記のすべての関数を完全に利用していますが、16 進数 '0x1234' を特定しているか、変換している数値が実際の ASCII 数値です。助けてください。

編集 私はそれを手に入れました、ch3kaは私を正しい軌道に乗せました、ありがとう!

以前はうまくいかなかった理由はわかりませんが、両方の値を16進数にしました

one = binascii.hexlify(line[7])
two = binascii.hexlify(line[8])
makeValue(one, two)` 

そして、ch3ka で定義された char makeValues を使用しました。

def makeValue(highbyte, lowbyte)
    print int(highbyte, 16)*256 + int(lowbyte, 16)

再度、感謝します!!!

4

1 に答える 1

1

値を文字として解釈しています。への文字int()のフィードは機能しません。次のように、値を文字列としてフィードする必要がありますint("0x5E", 16)。あなたが試みているのは実際int(chr(int("0x5E", 16)),16)には でint("^",16)あり、もちろん機能しません。

これらの結果を期待していますか?

makevalue('0x01', '0x5E') ->  350 0x15e 0b101011110
makevalue('0xFF', '0x00') ->  65280 0xff00 0b1111111100000000
makevalue('0x01', '0xFF') ->  511 0x1ff 0b111111111
makevalue('0xFF', '0xFF') ->  65535 0xffff 0b1111111111111111

もしそうなら、これを使うことができます:

def makeValue(highbyte, lowbyte):
    return int(highbyte, 16)*256 + int(lowbyte, 16)

またはIMOはより醜く、エラーが発生しやすい:

def makeValue(highbyte, lowbyte):
    return int(highbyte+lowbyte[2:], 16) # strips leading "0x" from lowbyte be4 concat
于 2012-04-18T13:47:13.843 に答える