Armadilloフォーラム

Pythonによるシリアル通信

wakabayashi

2021年6月24日 19時13分

次の記事を読んで、pyserialのインストールを行いました。
https://armadillo.atmark-techno.com/blog/615/3617

(問題)ボーレートが921600と高く、すぐにバッファがあふれてしまいます。

質問①
 バッファの容量を増やすことでバッファのあふれに対処したいと考えますが、
Armadillo-610ではどのようにすればよいでしょうか。

質問②
 シリアルのデータは接続しているセンサーから一方的に流れ出続けるため、一
定時間ごとにpyserialにより読み取る(line = ser.readline())必要があります。
 その読み取りの処理を割り込みなどで優先して処理する方法があれば教えてい
ただけませんか。

コメント

at_akihito.irie

2021年6月28日 9時25分

入江です。

> (問題)ボーレートが921600と高く、すぐにバッファがあふれてしまいます。

確認ですが、バッファが溢れたと判断された理由は何でしょうか。
例えばPythonプログラム実行時にエラーメッセージが出力されたのであれば、
添付していただけますでしょうか。

お手数おかけしますが、よろしくお願いいたします。

wakabayashi

2021年6月28日 12時53分

入江様
ご返信いただきましてありがとうございます。

> 確認ですが、バッファが溢れたと判断された理由は何でしょうか。
> 例えばPythonプログラム実行時にエラーメッセージが出力されたのであれば、
> 添付していただけますでしょうか。

pySerialにてinWaitingを確認したところ、戻り値は4095となり、データが欠損するためです。
このことから、バッファサイズが4095となっていると推定しています。
読み出し頻度を増やせば問題なく読み出せるのですが、
一括処理した方が総処理時間は短縮できます。
そのため、バッファサイズを拡げたいと考えています。

at_shinya.koga

2021年6月28日 17時44分

アットマークテクノの古賀です。

wakabayashiさん(2021年6月28日 12時53分):
>質問②
> シリアルのデータは接続しているセンサーから一方的に流れ出続けるため、一
>定時間ごとにpyserialにより読み取る(line = ser.readline())必要があります。
> その読み取りの処理を割り込みなどで優先して処理する方法があれば教えてい
>ただけませんか。

wakabayashiさん:
>>確認ですが、バッファが溢れたと判断された理由は何でしょうか。
>>例えばPythonプログラム実行時にエラーメッセージが出力されたのであれば、
>>添付していただけますでしょうか。
>
>pySerialにてinWaitingを確認したところ、戻り値は4095となり、データが欠損するためです。
>このことから、バッファサイズが4095となっていると推定しています。
>読み出し頻度を増やせば問題なく読み出せるのですが、
>一括処理した方が総処理時間は短縮できます。
>そのため、バッファサイズを拡げたいと考えています。

直接の回答ではなく、恐縮ですが、readline() ではなく、read() を使って一度にできるだけ多く読み出して、シリアルポートからの読み出し後に改行文字による分割を行うようにすることで、もしかすると改善されるかも知れません。いかがでしょうか?