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

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

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

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

Q&A

解決済

1回答

1669閲覧

python+openCVでのシリアル通信について

c-s

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/01/08 00:35

編集2021/01/08 04:14

PythonにてOpenCVを用いて画像処理をしています。
処理結果を用いて、別装置(マイコン)にシリアル通信でデータのやり取りを行い
その別装置を動かそうとしていいるのですが、どうも通信に遅れが生じてしまいます(マイコンからは「py,0000,0000,0000」のような信号を送っています。
送れなく、リアルタイムで通信ができるやり方があれば教えてください。
Pythonのコードは下記のものになります

python

1import sys 2import serial 3from cv2 import cv2 4 5comport = serial.Serial("COM1", baudrate=115200, parity=serial.PARITY_NONE, timeout=None) 6 7def data_send(buf): 8 while True: 9 if comport.out_waiting == 0: 10 break 11 12 data = buf +'\r\n' 13 send_data = data.encode('UTF-8') 14 comport.write(send_data) 15 return 16 17def data_recieve(): 18 19 if(comport.in_waiting > 0): 20 recieve_data = comport.readline() 21 22 try: 23 recieve_data_disp = recieve_data.strip().decode('UTF-8') 24 return str(recieve_data_disp) 25 except: 26 return 27 28def main(): 29 30 cap = cv2.VideoCapture(0) 31 32 while True: 33 ret, frame = cap.read() 34 recieve_data = data_recieve() 35 36 print(recieve_data) 37    data_send(recieve_data) 38 39 40 cv2.imshow('img',frame) 41 42 if cv2.waitKey(1) & 0xFF == ord('q'): 43 break 44 45 comport.close() 46 47if __name__ == '__main__': 48 main() 49

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

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

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

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

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

A_kirisaki

2021/01/08 01:50

どこで遅延が発生しているか測定してみましたか?ものによっては根本的に解決が不可能な場合もあります。
c-s

2021/01/08 02:05 編集

通信のみ部分のプログラム(OpenCVでの画像処理なし)では送受信ともに遅延はありませんでした。 また、送信側に関しても遅延なく、受信側でのみ遅延が発生していました。 もちろんマイコン側の送信を見ても遅延なく遅れているため、python側の受信のみで遅れが発生していました
A_kirisaki

2021/01/08 03:26

> また、送信側に関しても遅延なく、受信側でのみ遅延が発生していました。 送受信のみ部分ということでしょうか。それとも画像処理を載せてからでしょうか。ちょっと曖昧でよくわからなかったです。(あと今更だけどコードは前後を ``` で囲ってインデントも入れてね) ```Python def example(x): return x ```
c-s

2021/01/08 04:21 編集

```で囲むの知りませんでした ありがとうございます。 画像処理を載せる前は遅延はなかったのですが、 載せてから受信で数秒の遅れが発生しました。 ただし、遅れが蓄積されているような様子がなかったことも気になります
guest

回答1

0

ベストアンサー

一つのループで重い「画像処理」とリアルタイム性が必要な「シリアル通信」を行っていることが原因です。マルチスレッド化を考えましょう。
threading --- スレッドベースの並列処理 — Python 3.9.1 ドキュメント
具体的には「画像処理のループ」と「シリアル通信のループ」に分けてそれぞれのスレッドを立てることになるかと思います。

Python

1import threading 2import time 3 4def serial_communicate(args): 5 while True: 6 ... 7 8def image_process(args): 9 while True: 10 ... 11 12def main(): 13 th_com = threading.Thread(target=serial_communicate, args=(foo, bar), daemon=True) 14 th_img = threading.Thread(target=image_process, args=(baz, quax), daemon=True) 15 th_com.start() 16 th_img.start() 17 18 while True: 19 time.sleep(1)

こんな感じにしておけばよかろーなんではないんでしょうか、多分。

投稿2021/01/08 04:29

A_kirisaki

総合スコア2853

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

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

c-s

2021/01/08 05:40

遅延なくできるようになりました。 手寧な説明ありがとうございました。 並列処理なんで画像処理止めてもシリアルは残ってしまうようですが、 取りあえずやりたいことはできそうなんでもう少し手を加えたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問