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

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

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

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

Q&A

解決済

2回答

4916閲覧

pyserialで制御文字(STX,ETX)が前後に付いた文字列を送信するにはどうしたらいいのでしょうか。

FMA

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/05/26 05:34

編集2022/06/06 17:07

【目標】
STX1234ETX という文字列(前後に制御文字がついた数字のみの文字列)をpyserialを用いて送信したい。
文字コード:ASCII

【現段階での認識】
①ser.write(《バイト型に変換した文字列》)で送信する必要がある。

➁ASCIIコード表で
0x02⇔STX、0x03⇔ETX、0x31⇔1~0x34⇔4  と対応。

③1234だけを変換するのであれば、
number=1234
ser.write(number.encode('ascii'))
という処理をすればよい。

【不明点】
①送りたい文字列をバイト型にする必要があるのだが、
「STX1234ETX」の文字列をバイト型にした状態が「0x02 0x31 ....0x03」であるという認識で正しいのかがよくわかっていない。

➁①の認識が正しいのであれば、
ser.write(0x02)
ser.write(0x31)
ser.write(0x32)
ser.write(0x33)
ser.write(0x34)
ser.write(0x03)
とすれば6桁送信できたことになるのか?

③他サイトを見ていると
pyserialでSTXを送信するには
ser.write(chr(0x02))
としたらいいという記載を見かけたことがありました。
記載があったのはこちらのページです。
https://stackoverflow.com/questions/4449261/pyserial-cannot-send-stx

そうなると①➁の認識が誤っていそうなのですが、
ser.write(chr(0x02))つまりser.write(STX)という処理でいいということなのでしょうか。

それだと➁の書き方でなく
ser.write(STX)
ser.write(1)
ser.write(2)
ser.write(3)
ser.write(4)
ser.write(ETX)
でいいのかという話となってしまうのですが、バイト型に変換していない点でおかしいのではと感じています。

ネットで調べながら取り組んでみてはいるのですが、
正解がいまいちわからず質問させていただいております。
初歩的なところで抜けている知識も多々あるため、トンチンカンな部分もあると思いますがよろしくお願い致します。

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

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

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

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

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

can110

2022/05/26 05:52

「ser.write(chr(0x02))としたらいいという記載」の出典URLを記載ください。 (pyserial::wirteはバージョンにより引数の型の扱いが変わっているようなので)
guest

回答2

0

ベストアンサー

write(data)

Write the bytes data to the port. This should be of type bytes (or compatible such as bytearray or memoryview). Unicode strings must be encoded (e.g. 'hello'.encode('utf-8').
Changed in version 2.5: Accepts instances of bytes and bytearray when available (Python 2.6 and newer) and str otherwise.

と記載されているように、以前は引数としてstr型を渡すこともできていた(内部でバイナリ変換をしていた?)ようですが、現状はバイナリのみを受け取るようです。
すなわちSTXとETX文字を先頭と末尾に付加したうえでencodeによりバイナリ化したうえでwriteすればよいです。

Python

1def send_data(s): 2 s = '\2' + s + '\3' # 先頭と末尾にSTXとETXを付加する 3 return s.encode('ascii') 4 5dat = send_data('1234') 6 7# 中身の確認 8print(type(dat)) # <class 'bytes'> 9print(dat) # b'\x021234\x03' 10for b in dat: 11 print(hex(b)) 12""" 130x2 140x31 150x32 160x33 170x34 180x3 19"""

投稿2022/05/26 08:00

can110

総合スコア38234

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

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

FMA

2022/05/26 10:57

ご丁寧に、プログラム詳細までありがとうございます。 文字列の前後にSTX・ETXを合体させた上で変換すればよいというのが理解できました。 たいへん初歩的な部分の質問で恐縮なのですが、 一番最初の合体させる部分の処理で、 STXが'\2' ETXが'\3'(\は半角です)という表現になっているのはどういった理屈なのでしょうか?   0x02やSTXという表現とはまた異なる表現が登場したように感じているのですが、教えていただけないでしょうか。
FMA

2022/05/29 15:23

ご解説ありがとうございます。 たいへん勉強になりました。 お送りいただいたURLも確認させていただきます。
FMA

2022/06/06 08:07

本日、動作確認をし、 やりたかったことができましたので ベストアンサーとさせていただきます。 大変お世話になりました。
guest

0

実際にそれでコードを書いて、どういう通信になるのか確認してみては
#通信の相手方が必要となりますが

投稿2022/05/26 05:42

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問