Armadilloフォーラム

Armadillo-IoT G3L RS485を使った受信

dotsuru

2021年10月21日 14時36分

Armadillo-IoT G3Lと弊社のシリアルポートを有する基盤を接続し、
(1) Armadilloから弊社の基板に文字列を送信
(2) 弊社の基板で文字列を受信
(3) 文字列受信後xx秒Waitする
(4) 弊社の基板からArmadilloに文字列を送信
(5) Armadilloで文字列を受信し、受信した文字列を表示する
というテストをRubyとCの両方で行いました。
以下にArmadilloで受信している部分(5)のソースを抽出します。
■Ruby
printf("EXEC sp.gets\n")
ss = sp.gets
printf("RECV : %s", ss)

■C
printf("EXEC read\n");
read(fd,ss, 15);
printf("RECV : %s",ss);

Ruby, Cともに同じ動きをするのですが、
(3)のWaitの秒数が、20msec以下なら正常に動作するのですが、
それ以上Waitすると、"EXEC sp.gets", "EXEC read"を表示したまま、
弊社の基板から送信した文字列が受信できない状態になります。
(受信待ちの状態が継続?)

なお、シリアル通信設定は、
device : /dev/ttymxc1
baudrate : 19200
data length : 8bit
stopbit : 1
parity : なし
です。

弊社の基板同士で同じ通信させてところ、
Wait値を何秒に設定しても正常に受信できたので、
Armadillo側の受信の問題だと判断しました。

Armadillo側に、シリアル通信で20msec以上受信がないと、
リンクが切れてしまうような設定があるのでしょうか?

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

コメント

at_syunya.ohshio

2021年10月22日 14時47分

大塩です。

> Armadillo-IoT G3Lと弊社のシリアルポートを有する基盤を接続し、
> (1) Armadilloから弊社の基板に文字列を送信
> (2) 弊社の基板で文字列を受信
> (3) 文字列受信後xx秒Waitする
> (4) 弊社の基板からArmadilloに文字列を送信
> (5) Armadilloで文字列を受信し、受信した文字列を表示する
> というテストをRubyとCの両方で行いました。
> 以下にArmadilloで受信している部分(5)のソースを抽出します。
> ■Ruby
> printf("EXEC sp.gets\n")
> ss = sp.gets
> printf("RECV : %s", ss)
>
> ■C
> printf("EXEC read\n");
> read(fd,ss, 15);
> printf("RECV : %s",ss);
>
> Ruby, Cともに同じ動きをするのですが、
> (3)のWaitの秒数が、20msec以下なら正常に動作するのですが、
> それ以上Waitすると、"EXEC sp.gets", "EXEC read"を表示したまま、
> 弊社の基板から送信した文字列が受信できない状態になります。
> (受信待ちの状態が継続?)
>
> なお、シリアル通信設定は、
> device : /dev/ttymxc1
> baudrate : 19200
> data length : 8bit
> stopbit : 1
> parity : なし
> です。
>
> 弊社の基板同士で同じ通信させてところ、
> Wait値を何秒に設定しても正常に受信できたので、
> Armadillo側の受信の問題だと判断しました。
>
> Armadillo側に、シリアル通信で20msec以上受信がないと、
> リンクが切れてしまうような設定があるのでしょうか?
>
> 以上、よろしくお願いいたします。

上記原因調査のため、ご利用になっているインストールディスクイメージ
または、以下バージョンをお教えいただけますでしょうか。
・Linux カーネル
・ユーザーランド

以上です。

> 大塩です。
>
> 上記原因調査のため、ご利用になっているインストールディスクイメージ
> または、以下バージョンをお教えいただけますでしょうか。
> ・Linux カーネル
> ・ユーザーランド

Linuxカーネルのバージョンは、4.9.133-at15 です。
ユーザーランドのVersionはどうやって取得するのでしょうか?
more /proc/version でカーネルバージョンの後ろに表示される、atmark@atde7 のことですか?

at_syunya.ohshio

2021年10月25日 10時13分

大塩です。

> > 上記原因調査のため、ご利用になっているインストールディスクイメージ
> > または、以下バージョンをお教えいただけますでしょうか。
> > ・Linux カーネル
> > ・ユーザーランド
>
> Linuxカーネルのバージョンは、4.9.133-at15 です。
> ユーザーランドのVersionはどうやって取得するのでしょうか?
> more /proc/version でカーネルバージョンの後ろに表示される、atmark@atde7 のことですか?

情報ありがとうございます。
ユーザーランドのバージョンにつきましては、以下からダウンロードできるユーザーランドのファイル名に記載されている日付(例:20210730)となります。
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g3…

カーネルのバージョンがat15 とのことですが、RS485 に関する修正がいくつか行われているため
最新版である at21 で動作確認していただけますでしょうか。

アップデートの詳細は以下から確認することができます。
https://armadillo.atmark-techno.com/news/software-updates?field_taxonom…

お世話になっております。

Linuxカーネルを4.9.133-at21 にVersion Upしたところ、
Cで書いたほうは正常に動作するようになりました。

前回のメールでは報告していなかったのですが、
Armadilloから弊社ボードに文字列を送信すると、
ECHO BACKが返っていたのですが、それもなくなりました。

ただrubyで書いたほうは、受信データの最初の1byteが欠けてしまうようになってしまいました。
例:弊社ボードからの送信文字列="12345" / Armadilloの受信文字列="2345"
rubyのgetsメソッドには、なにか問題があるようです。

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

at_syunya.ohshio

2021年11月2日 17時16分

大塩です。

> ただrubyで書いたほうは、受信データの最初の1byteが欠けてしまうようになってしまいました。
> 例:弊社ボードからの送信文字列="12345" / Armadilloの受信文字列="2345"
> rubyのgetsメソッドには、なにか問題があるようです。

上記現象について ​wait 時間を変更しても必ず発生する現象でしょうか。

以上です。

> 大塩です。
> 上記現象について ​wait 時間を変更しても必ず発生する現象でしょうか。

wait時間を設定してrubyを実行したところ、
最初の数回は正常に受信するのですが、そのあと全く受信できなくなり
さらに送信を続けると、OSがCrashしてリブートがかかるようになってしまいました。

カーネルのVersion Up前は、リブートがかかるようなことは一度も無かったので、
カーネルのVersion Upが原因と思われます。

なお、Cで書いたほうは、問題なく動作しています。

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

at_syunya.ohshio

2021年11月5日 17時14分

大塩です。

> wait時間を設定してrubyを実行したところ、
> 最初の数回は正常に受信するのですが、そのあと全く受信できなくなり
> さらに送信を続けると、OSがCrashしてリブートがかかるようになってしまいました。
>
> カーネルのVersion Up前は、リブートがかかるようなことは一度も無かったので、
> カーネルのVersion Upが原因と思われます。
>
> なお、Cで書いたほうは、問題なく動作しています。
>

状況の確認のため、なるべく同様の環境でのテストを行いたいので
お出しできる範囲で良いのですが、この現象についてのテストコードがありましたら
送付いただけますでしょうか。

以上です。

> 状況の確認のため、なるべく同様の環境でのテストを行いたいので
> お出しできる範囲で良いのですが、この現象についてのテストコードがありましたら
> 送付いただけますでしょうか。

お世話になっております。
問題のソースを添付いたします。

LTE経由で文字列を受け取ると、"0109"のような4byteをシリアルで弊社のボードに送信し、
"<3>\n"のような4byteの文字列を受信します。

この"<3>"の先頭の"<"が欠けてしまいます。

ファイル ファイルの説明
server_報告用.rb Crashするソース

at_syunya.ohshio

2021年11月15日 13時43分

大塩です。

> お世話になっております。
> 問題のソースを添付いたします。
>
> LTE経由で文字列を受け取ると、"0109"のような4byteをシリアルで弊社のボードに送信し、
> "<3>\n"のような4byteの文字列を受信します。
>
> この"<3>"の先頭の"<"が欠けてしまいます。

source の送付、情報ありがとうございます。

頂いた source を確認し、こちらでも RS485 の通信テストを行ってみましたが、
ご報告の現象は発生しませんでした。

お手数ですが、以下の結果をお教えいただけますでしょうか。
・puts, gets のみで構成されたコードを実行した場合の取得データ状態

Armadillo-IoT G3L を二台以上お持ちである場合は、以下もご確認いただけますでしょうか。
・G3L同士をRS485 で接続し、確認用のテストコードで同様の現象が発生するか
 接続方法につきましては以下を参考にしてください。
 https://armadillo.atmark-techno.com/howto/armadillo-iot-g3l-modbus-slave
 また、対向機となるG3Lの受信、送信は製品マニュアルの以下をご参照ください。
 https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…

以上です。