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で通信した場合のみ発生しています。
このような状況なのですが、何か考えられることや対策等ございますでしょうか?
以上、よろしくお願いいたします。
コメント
daido-ikegami
お世話になります。
コマンド実行結果をご連絡します。
・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
以上、よろしくお願いします。
daido-ikegami
daido-ikegami
at_syunya.ohshio
大塩です。
> 立て続けに申し訳ありません。
>
> 過去の投稿を見ていたところ、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");
以上です。
daido-ikegami
at_mizo
溝渕です。
> 一点確認させていただきたいのですが、本パッチでは、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…
※ 要ログイン
at_syunya.ohshio
2021年2月5日 17時30分
大塩です。
原因切り分けのため、Armadilloにて以下コマンドを実行し、その結果をお教えいただけますでしょうか。
・
uname -a
・
dpkg -l | grep "atmark"
以上です。