🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1270閲覧

タイムコードデータをpythonのシリアル通信で取り込みたい

yuua124

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/03/25 05:27

前提・実現したいこと

タイムコード(時:分.秒.フレーム)データを
RS232ケーブルを用いたシリアル通信でPCに取り込むシステムを作っています。
pythonで実装してみたのですが、
b''
と表示されるばかりで、上手く受信できていないのか不明です。

<送信側の設定>
・Bits per second: 9600
・Data bits: 8
・Parity: Odd
・Stop bits: 1

LTC(タイムコード)が入力されると、1キャラクタあたり8ビットを使用して以下のデータを出力する。
Byte 0 = ブレーク信号(20ビットLowレベル -> 2ビットハイレベル)
Byte 1 = XBhステータスおよびデータレングスバイト
Byte 2 = 00h-29h TIMEビット[フレーム](packed BCD)
Byte 3 = 00h-59h TIMEビット[秒](packed BCD)
Byte 4 = 00h-59h TIMEビット[分](packed BCD)
Byte 5 = 00h-23h TIMEビット[時](packed BCD)
Byte 6 = ・・・
・・・
Byte 12 = ・・・

Byte 2-5 に格納されているデータを抽出したいです。
タイムコードですので、1フレームずつ連続で送信し続けます。
そのほかの情報は今回不要と考え、割愛させていただきました。

ご助言・アドバイスをお願いいたします。

該当のソースコード

python3

1import serial 2 3ser=serial.Serial( 4 port='COM1', 5 baudrate=9600, 6 bytesize=serial.EIGHTBITS, 7 parity=serial.PARITY_ODD, 8 stopbits=serial.STOPBITS_ONE, 9 timeout=0) 10while True: 11 line=ser.read() 12 print(line)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/25 05:47

切り分けのためにTeraTermとかシリアル端末でまずは受信できるのか試しては?それで確実に受信ができることがわかってからPythonでやってみたら良いと思います。
yuua124

2021/03/25 08:02

ご回答ありがとうございます。 TeraTermを用いましたが、受信を確認できませんでした。 ただ、タイムコード出力端末のメーカーが公開しているアプリをPC内で用いると、 正常なタイムコードが表示されますので、PC内には入力できていると思われます。 アプリはexeファイルしかなく、どのように表示しているかは不明でした。 可視化するだけでなく、数値データとして欲しいです。
ikadzuchi

2021/03/28 14:41

機械とPCはどのようにつないでいますか? > ブレーク信号(20ビットLowレベル -> 2ビットハイレベル) を見る限りRS232Cの電圧ではなさそうですが。
退会済みユーザー

退会済みユーザー

2021/03/29 23:46 編集

専用アプリではOKでTeraTermで受信できないなら、TeraTermで受信できるまで色々通信条件の 設定を探った方が良いと思います。フロー制御のxon/xoff , rts/cts, dsr/dtrあたりを確認してみては?それで受信できるようになったらPythonの方も同じようにセットしてやれば動くと思います。
guest

回答1

0

まずは、一つのメッセージを受信することを目指しましょう

Byte 1 = XBhステータスおよびデータレングスバイト

このバイトを受信するまで、受信データを読み飛ばします
このデータが受信されてから、その後の10バイトを読み込み、11バイトのメッセージデータとして、次の処理(タイムデータの読み出し)に回します。

ということで、11バイトのメッセージデータの受信を実装してみてください。
なお、メッセージデータはバイナリデータのため、そのままではprintできないので、16進変換するなどして表示させ、メッセージ内容を確認することです

投稿2021/03/25 06:33

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問