Armadilloフォーラム

ArmadilloG3LのRS485通信ポートで通信ライブラリ(Pyserial)が正常に動作しなくなる。

g-shinya

2022年5月9日 13時27分

<Armadillo-G3Lの状態>
imx.cを添付いたします。
uname:Linux armadillo 4.9.133-at16 #2 (担当営業者様より、at22での検証もいたしましたが、同じ結果となりました。)
SMP PREEMPT Fri May 21 18:01:52 JST 2021 armv7l GNU/Linux

dpkg -l | grep "atmark":
ii atmark-x1-base 2.5.2-1 armhf Atmark Techno X1 platform base software
ii libmm-glib0:armhf 1.6.4-1atmark8 armhf D-Bus service for managing modems - shared libraries
ii modemmanager 1.6.4-1atmark8 armhf D-Bus service for managing modems

・DMA無効
・RXTL_UART=1

参考フォーラム
https://armadillo.atmark-techno.com/forum/armadillo/8523

<症状>
 ArmadilloG3LのRS485通信ポートで使用している
 通信ライブラリ(Pyserial)が正常に動作しなくなる。

<詳細>
 in_waiting()の受信数分をread()で取り出してもin_waiting()の
 受信数が「0:受信データなし」にならない。
 受信数がゼロにならず、返信データが途切れない状態が続くため
 受信が終了しない(できない)。
 フローチャート参照お願いいたします。

<症状再現方法>
 RS485の信号線を短い間隔で短絡/開放させる。
 (RS485通信線にノイズを入れる)

<質問>
 上記動作になる原因と回避方法、また復旧方法を教えてください。

ファイル ファイルの説明
imx.c
フローチャート.png
コメント

溝渕です。

すみません。いくつか質問させてください。

> <症状再現方法>
>  RS485の信号線を短い間隔で短絡/開放させる。
>  (RS485通信線にノイズを入れる)

ノイズを入れない場合は、受信数が「0:受信データなし」になり、受信が終了しますか?

>  受信数がゼロにならず、返信データが途切れない状態が続くため
>  受信が終了しない(できない)。

このとき、何が読めますか?

また、この(受信が終了しない)状態に陥った際に、対向機器から文字を送信した場合、その文字を受信することはできますか?

>> <症状再現方法>
>>  RS485の信号線を短い間隔で短絡/開放させる。
>>  (RS485通信線にノイズを入れる)
>ノイズを入れない場合は、受信数が「0:受信データなし」になり、受信が終了しますか?
(1)正常に動作している状態
 受信データを通信ライブラリから取得すると受信数はゼロになります。
 →受信が正常終了。
(2)ノイズによって受信数がゼロにならない状態
 ノイズを停止しても受信数はゼロになりません。
 →受信が終了しません。

>>  受信数がゼロにならず、返信データが途切れない状態が続くため
>>  受信が終了しない(できない)。
>このとき、何が読めますか?
読みだしたデータは全て0xffでした。
受信数は時間が経過すると変化(増加)していました。

> また、この(受信が終了しない)状態に陥った際に、対向機器から文字を送信した場合、その文字を受信することはできますか?
こちらについては再度確認し連絡いたします。

受信数がゼロにならない状態(通信ライブラリpyserialのAPIが受信し続けている状態)で
下記試験を行いました。

【試験内容】
試験1:485通信ラインを短絡/開放
試験2:485通信ラインにPCからデータを送信

【試験結果】
 試験1:
受信数がゼロにならない状態を継続した。

 試験2:
1byte目以外のデータは正常に受信できた。
   また、通信ライブラリの受信バッファ内にある受信数がゼロになり、正常復帰した。
(1byte目は下記太字データ)

・送信データ: 0x00~0x0Aまでの10byteを送信
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A

・受信データ:
(FFデータが続く)~0xFF,0xFF,0x03,0x01,0x02,0x03,0x04,0x05,
0x06,0x07,0x08,0x09,0x0A

以上よろしくお願いいたします。

溝渕です。

ご確認ありがとうございます。

現在までの調査結果より、次のようになると思います。

* 485通信ラインにノイズが入らない限りは問題は発生しない
* 問題が発生すると(対向機器からデータ送信が無いのに)0xffを受信し続ける
* 問題が発生した状態で対向機器からデータ送信されると復帰する

問題の原因がデバイスドライバかアプリケーションかを切り分けたいと思います。次のようにpythonを使わない場合でも同様の挙動となりますか。

[g3l]# stty -F /dev/ttymxc1 raw speed 115200
[g3l]# od -x /dev/ttymxc1

上記コマンド例では、ボーレート等のシリアル設定は適当に設定しています。構成に合った設定に適宜読み変えてください。

また、RS485の通信設定(全二重/半二重等)はどのようになっていますか。もしU-Bootの保守モードから設定している場合は、そのコマンドを教えてください。

https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…