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

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

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

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

Q&A

解決済

1回答

8932閲覧

バイナリ文字の処理に関して

umechan47

総合スコア17

Python

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

0グッド

0クリップ

投稿2017/08/14 02:31

編集2017/08/14 04:40

pythonのモジュールでpyserialを利用してUSB通信先のセンサとシリアル通信のテストをしています.
ATコマンドを送信して,その返答を読み込んだ際に以下のような文字列で返ってきました.
バイナリ文字の処理はあまり素養がないためどのようにして文字列に変換すればよいのか調べたのですが,困惑してしまいました...
'\xe6\x80\x98\x80\x1e\x0c\xe6\x80\x98\x80'

このような文字列の処理はどのように考えて対処していけばよいのか,ご教授いただきたいです.
よろしくお願いします.

追記です

python2.7 コマンドに対して,<CR><LF>OK<CR><LF> または<CR><LF>#<CR><LF>の返答が帰ってくるようです.
コマンドはasciiで書き込み,出力は
計測が開始されると32bitのリトルエンディアンの形式でデータが受信されるようです.
今は以下のコードで動作確認をしているところでした.

python

1import serial 2import sys, time 3import os 4 5def main(): 6 7 port = 'COM5' 8 baudrate = 460800 9 ser = serial.Serial(port, baudrate, timeout=3) 10 11 print 'Starting Up Serial Monitor' 12 13 if ser.isOpen(): 14 15 try: 16 ser.flushInput() # flush input buffer, discarding all its contents 17 ser.flushOutput() # flush output buffer, aborting current output 18 time.sleep(1) 19 20 ser.write(bytes("ATCONFIG\r\n")) 21 time.sleep(1) 22 print "Send the command to config sensor" 23 24 ser.write(bytes("ATWRDTRG = 2, 00005, 0\r\n")) 25 time.sleep(1) 26 27 28 ser.write(bytes("ATRDDTRG\r\n")) 29 time.sleep(1) 30 31 print "Send the command to read the trigger setting" 32 print ser.portstr 33 r = ser.readline() 34 print r.encode('hex') 35 print r 36 37 ser.write(bytes("ATENDMES\r\n")) 38 time.sleep(1) 39 40 print "Send the command to start Measurement Mode" 41 42 ser.write(bytes("ATMESMD1\r\n")) 43 time.sleep(1) 44 45 print "Send the command to start Measurement Mode" 46 time.sleep(2.5) # Measurement Wait Time is 220[ms] 47 48 49 50 nline = 0 51 while True: 52 ser.write(b"ATRDDFRM\r\n") 53 54 str = ser.readline() 55 print ser.readline() 56 57 ser.write(bytes("ATREQDAT\r\n")) 58 print "Send the command to request Measurement data" 59 60 nline = nline + 1 61 if (nline >= 1000): 62 break 63 64 65 ser.close() 66 67 except Exception as e: 68 print "error communicating...: " + str(e) 69 70 else: 71 print "cannot open serial port " 72 73 74# Main Process ----------------------------- 75if __name__ == '__main__': 76 try: 77 78 main() 79 80 except Exception as e: 81 print('Error occurred on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e), e) 82 raise e

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

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

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

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

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

can110

2017/08/14 03:04

pythonバージョン、センサ名、センサ送受信データの仕様、加えてできれば具体的な動作コードを追記ください。
guest

回答1

0

ベストアンサー

python2.7 コマンドに対して,<CR><LF>OK<CR><LF> または<CR><LF>#<CR><LF>の返答が帰ってくるようです.

2.7ではバイナリもstr型なので、(元データがASCIIコード範囲内であれば)そのまま文字として取り扱えます。

計測が開始されると32bitのリトルエンディアンの形式でデータが受信されるようです.

struct.unpackまたはstruct.unpack_fromを使うことで、任意長のバイナリデータをlongなど任意の型の値として取得することができます。

32bit=4byte長のバイナリをどの型(longやfloatなど)として取得すべきかは、データの送受信仕様によります。

動作例

Python

1import struct 2 3# バイナリ→文字列 4recv = b'\r\nOK\r\n' 5print(type(recv)) 6print(recv) 7 8# バイナリ→任意の型として解釈 9recv = b'\xe6\x80\x98\x80\x1e\x0c\xe6\x80\x98\x80' 10fmt = '<l' # long little-endian として解釈 11ret = struct.unpack_from(fmt,recv,0) # 先頭4byte 12print(ret[0]) 13ret = struct.unpack_from(fmt,recv,4) # 次の4byte 14print(ret[0])

結果例

<type 'str'> OK -2137489178 -2132407266

投稿2017/08/14 08:55

can110

総合スコア38252

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

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

umechan47

2017/08/15 02:47

解答有難うございます! asciiで帰ってくるとしたら,そのまま受け取れるということでしょうか. コマンドの返答として, 10Lまたは8Lといった返事が帰ってくるのですが,これは何の返答か分かるでしょうか? 知識が乏しく,質問が解りづらくてすいませんがよろしくお願いします.
can110

2017/08/15 02:55 編集

受信データ(バイナリ)をどのように解釈すべきかは、相手と決めた通信仕様によります。 >asciiで帰ってくるとしたら,そのまま受け取れるということでしょうか. 受信データ(バイナリ)をasciiコードで表現された文字としてみなしてよいのであれば、そのまま文字として扱えます。 >10Lまたは8Lといった返事が帰ってくるのですが,これは何の返答か分かるでしょうか? これは4バイトの受信データをstruct.unpackでlong値として数値化した結果でしょうか? であれば、それらの数値が何を意味するかはセンサとの通信仕様によるので一般的には分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問