Armadilloフォーラム

RS00によるシリアル通信について

daido-ikegami

2021年2月5日 17時19分

お世話になります。

Armadillo-IoT G3にRS232Cアドオンモジュール(RS00)を実装して、pythonとpyserialを使用して対向機器との通信を行っているのですが、
受信データが取得できず(受信サイズ0)、次の通信時に2回分の受信データを取得する事象が発生しております。
詳細は以下の通りです。

・開発言語 : python3.5(pyserial使用)
・通信手順 : 1分周期で対向機器と通信を行う。(以下の手順)
         ①Armadillo-IoT G3から対向機器にデータ要求送信
         ②データ送信後、COMポートからread(受信タイムアウトは2秒に設定)
         ※受信データサイズはその都度、数十バイト~2,000バイト程度で変動するが、2秒以内には完了する仕様です。
         ※①②を複数回繰り返す(回数はその都度変動)
          繰り返しが完了したら、次の周期(1分後)に①から実行
・問題事象 : 上記通信手順で、①②の繰り返しの最後(10回繰り返すとした場合、10回目)の受信データが取得できない。
        このとき、プロトコルアナライザで回線をモニタすると、送受信は正常に行われている。(データ受信しているはずであるが、アプリから取得できない)
        次周期で①データ要求を行い、②その応答をreadすると、受信できていなかった受信データと今回の受信データが受信バッファに入っており、
        2データが一緒に取得される。
        また、本事象は必ず発生するわけではないが、事象が発生するデータパターンでは毎回発生する。(残念ながらパターンは特定できていません)
・調査状況 : ①RS00ではなく、USBポートにUSBシリアルケーブルを接続して同じプログラムで実行すると本事象は発生しない。
        ②WindowsPC上で同じプログラムを実行しても発生しない。
        ※今のところ、RS00で通信した場合のみ発生しています。

このような状況なのですが、何か考えられることや対策等ございますでしょうか?
以上、よろしくお願いいたします。

コメント

at_syunya.ohshio

2021年2月5日 17時30分

大塩です。

原因切り分けのため、Armadilloにて以下コマンドを実行し、その結果をお教えいただけますでしょうか。
uname -a
dpkg -l | grep "atmark"

以上です。

お世話になります。
コマンド実行結果をご連絡します。

・uname -a
  Linux armadillo 4.9.133-at17 #2 SMP PREEMPT Wed Jan 27 08:52:50 JST 2021 armv7l GNU/Linux

・dpkg -l | grep "atmark"
  ii atmark-x1-base 2.4.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

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

以下、追加情報です。

現在、本事象の発生パターンについて調査を行っております。
対向機器からの送信データサイズを変化させながら確認したところ、データサイズが48バイトの倍数で必ず事象が発生しております。
(対向機器が12バイト単位のデータしか送信できないため、調査は12バイトの倍数で実施しています)

 48バイト:NG
 96バイト:NG
  ~
 288バイト:NG
といった感じです。

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

立て続けに申し訳ありません。

過去の投稿を見ていたところ、2018年9月18日の「シリアル通信について」で、16バイト単位の
データが受信できないとの項目を見つけました。
まさに今回の事象と一致していると思い、そこに記載されていた「imx.c」へのパッチを適用
したところ、問題なく受信できるようになりました。

同一の問題であるとの認識で間違いないでしょうか?

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

at_syunya.ohshio

2021年2月8日 14時22分

大塩です。

> 立て続けに申し訳ありません。
>
> 過去の投稿を見ていたところ、2018年9月18日の「シリアル通信について」で、16バイト単位の
> データが受信できないとの項目を見つけました。
> まさに今回の事象と一致していると思い、そこに記載されていた「imx.c」へのパッチを適用
> したところ、問題なく受信できるようになりました。
>
> 同一の問題であるとの認識で間違いないでしょうか?

発生している現象は、同じとの認識で問題ないと思われます。
この現象はDMAに関する内容であり、ご参考にされたフォーラムのパッチは
DMAを使用しないというパッチとなります。
この場合、CPU負荷が大きくなるため
DMAを使用しつつ、この現象を回避するパッチを送付致します。
以下を適用し、テストしてみてください。

--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1347,7 +1347,8 @@ static int imx_uart_dma_init(struct imx_port *sport)
 	slave_config.direction = DMA_DEV_TO_MEM;
 	slave_config.src_addr = sport->port.mapbase + URXD0;
 	slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
-	slave_config.src_maxburst = RXTL_UART;
+	/* one byte less than the watermark level to enable the aging timer */
+	slave_config.src_maxburst = RXTL_UART - 1;
 	ret = dmaengine_slave_config(sport->dma_chan_rx, &slave_config);
 	if (ret) {
 		dev_err(dev, "error in RX dma configuration.\n");

以上です。

大塩 様

ご連絡ありがとうございます。
送付いただきましたパッチを適用して、正常に受信できることを確認しました。
しばらくこの状態でテストを継続したいと思います。
一点確認させていただきたいのですが、本パッチでは、dmaengine_slave_config
に渡すパラメータのsrc_maxburstの値を-1(16→15)しているだけですが、本修正
によりどのように動作が変わるのでしょうか?

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

溝渕です。

> 一点確認させていただきたいのですが、本パッチでは、dmaengine_slave_config
> に渡すパラメータのsrc_maxburstの値を-1(16→15)しているだけですが、本修正
> によりどのように動作が変わるのでしょうか?

パッチのコメントにある通り、aging timerによるRX FIFOからのdata popが行
なわれるようになります。

aging timerについての詳細は、"i.MX 7Dual Applications Processor Reference Manual"[1]の"15.3.4.6.2 Aging Character Detect"を参照してください。

[1]: https://www.nxp.com/products/processors-and-microcontrollers/arm-proces…

※ 要ログイン