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

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

ただいまの
回答率

90.51%

  • Python

    11744questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,851

umechan47

score 11

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のリトルエンディアンの形式でデータが受信されるようです.
今は以下のコードで動作確認をしているところでした.

import serial
import sys, time
import os

def main():

    port = 'COM5'
    baudrate = 460800
    ser = serial.Serial(port, baudrate, timeout=3)

    print 'Starting Up Serial Monitor'

    if ser.isOpen():

        try:
            ser.flushInput()  # flush input buffer, discarding all its contents
            ser.flushOutput()  # flush output buffer, aborting current output
            time.sleep(1)

            ser.write(bytes("ATCONFIG\r\n"))
            time.sleep(1)
            print "Send the command to config sensor"

            ser.write(bytes("ATWRDTRG = 2, 00005, 0\r\n"))
            time.sleep(1)


            ser.write(bytes("ATRDDTRG\r\n"))
            time.sleep(1)

            print "Send the command to read the trigger setting"
            print ser.portstr
            r = ser.readline()
            print r.encode('hex')
            print r

            ser.write(bytes("ATENDMES\r\n"))
            time.sleep(1)

            print "Send the command to start Measurement Mode"

            ser.write(bytes("ATMESMD1\r\n"))
            time.sleep(1)

            print "Send the command to start Measurement Mode"
            time.sleep(2.5)  # Measurement Wait Time is 220[ms]



            nline = 0
            while True:
                ser.write(b"ATRDDFRM\r\n")

                str = ser.readline()
                print ser.readline()

                ser.write(bytes("ATREQDAT\r\n"))
                print "Send the command to request Measurement data"

                nline = nline + 1
                if (nline >= 1000):
                    break


            ser.close()

        except Exception as e:
            print "error communicating...: " + str(e)

    else:
        print "cannot open serial port "


# Main Process -----------------------------
if __name__ == '__main__':
    try:

        main()

    except Exception as e:
        print('Error occurred on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e), e)
        raise e
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/08/14 12:04

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

    キャンセル

回答 1

checkベストアンサー

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など)として取得すべきかは、データの送受信仕様によります。

動作例

import struct

# バイナリ→文字列
recv = b'\r\nOK\r\n'
print(type(recv))
print(recv)

# バイナリ→任意の型として解釈
recv = b'\xe6\x80\x98\x80\x1e\x0c\xe6\x80\x98\x80'
fmt = '<l' # long little-endian として解釈
ret = struct.unpack_from(fmt,recv,0) # 先頭4byte
print(ret[0])
ret = struct.unpack_from(fmt,recv,4) # 次の4byte
print(ret[0])

結果例

<type 'str'>

OK

-2137489178
-2132407266

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/15 11:47

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

    キャンセル

  • 2017/08/15 11:53 編集

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

    キャンセル

同じタグがついた質問を見る

  • Python

    11744questions

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