2017-01-02 11 views
0

デバイスに1バイト( "\ x2b")を送信し、1エコーバイト+ 3バイトのデータ( "\ x2b \ x ?? \ x ?? \ x ??")私はエコーバイトを取り除くために.replace( "2b"、 ""、4)を使用しています。int(16)に受信された3バイトの3バイトを変更し、別々に呼び出すことができる3つの異なる変数に名前を付ける必要があります一度に1つずつ計算します。ここまで私がこれまで持っていたことがあります。Pythonのpyserial変数

import serial 
    import os 

    ser = serial.Serial(port="COM17", baudrate=9600) 
    ser.open() 
    ser.write("\x2b") 
    print int(ser.readline(4).encode("hex").replace("2b", "", 4), 16) 
    ser.close() 

    os.system("pause") 
+1

(最後の行):

あなたはPythonでシンプルinput呼び出し、代わりに<enter>を押すようにユーザに尋ねるを追加することができます。このコードの出力が何であるべきか、ポートに書き込まれる内容と印刷される内容を指摘してください。 – kabanus

+0

私はそれを送信しているデバイス( "0x2b")を送信しています( "0x2b")+それは毎回異なる3バイトを送信します。私は3バイトをint(16)の数値に変更し、それらをいくつか列挙して、これらの3つの数値を別々に呼び出して計算を行う必要があります。 –

+0

ポートから4バイト、元の書き込みを3バイト追加します。これらの3バイトを3つの異なる変数に分割したいですか? – kabanus

答えて

0

3(?)int16(別名short)の数字に3バイトのストリームを変換する "自然" の変換はありません。

だから、より具体的にする必要があります。

  • があなたの代わりにint8にバイトを変換したいですか?もちろん結果の数値をint16と見なすことは完全に有効です(適合するように)
  • 符号付き/符号なし出力をしたいですか?
  • 実際にマルチバイト番号(int16など)を使用している場合は、BIG_ENDIANまたはLITTLE_ENDIANを使用していますか?いずれにしても

structパッケージはあなたのための変換を行うことができます。

import struct 

# read 4 bytes, discard the first one, so we get a list of 3 bytes 
inputdata = ser.readline(4)[1:] 

# the following parses 'inputdata' as 3 `uint8` numbers 
a,b,c = struct.unpack('BBB', inputdata) 
+0

私はOPがhexを望んでいると思います。「int(n、16)」 –

+0

これは(uint 16)、BIG_ENDIAN –

+0

あなたの質問から、あなたはHexで提示したい3つの1バイトの数字がほしいと思います。あなたは、2バイト(16ビット)のデータサイズを、捨てられた数値ベース(16)と混同しています。 – jsbueno

1

は、バイト文字列から任意のバイナリデータを取得するstructモジュールを使用してください:側では

import serial 
import os 
import struct 

ser = serial.Serial(port="COM17", baudrate=9600) 
ser.open() 
ser.write("\x2b") 
response = ser.readline(4) 
echo, a, b, c = struct.unpack("4B", response) 
print ("Response numbers: {:02x}, {:02x}, {:02x}".format(a, b, c)) 
ser.close() 

を注:プログラムの一部としてos.system("pause")を使用しないでください。プログラムの実行中にWindowsのDOSプロンプトが開いたままになっているが、(1)Windowsのみ、Mac OS XとLinuxで動作するプログラム、(2)通常の操作のために他のすべてのプロセスを作成します。それはあなたの英語を取得するには少し難しい

input("Press <enter> to close terminal") 
+0

偉大な働きをした、まさに私が探していたもの。 –

+0

'struct.unpack'がなぜ' bytes'だけ必要なのですか?どうして 'a、b = b'ab '? –

+0

はい、それはうまくいくでしょう - しかし、truct.unpackは異なるサイズの整数を持つ人のために働くでしょう。しかしもっと重要です - OPはPython2を使用しています。ここで、バイトはデフォルトでテキスト用に使用される "バイト文字列"と同義です。Python 2のバイト項目は数字ではなくlen-1バイト文字列です。 (print-functionの代わりにprintステートメントを見るにはPython2を参照) – jsbueno