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以上受信がないと、
リンクが切れてしまうような設定があるのでしょうか?
以上、よろしくお願いいたします。
コメント
dotsuru
at_syunya.ohshio
大塩です。
> > 上記原因調査のため、ご利用になっているインストールディスクイメージ
> > または、以下バージョンをお教えいただけますでしょうか。
> > ・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…
dotsuru
お世話になっております。
Linuxカーネルを4.9.133-at21 にVersion Upしたところ、
Cで書いたほうは正常に動作するようになりました。
前回のメールでは報告していなかったのですが、
Armadilloから弊社ボードに文字列を送信すると、
ECHO BACKが返っていたのですが、それもなくなりました。
ただrubyで書いたほうは、受信データの最初の1byteが欠けてしまうようになってしまいました。
例:弊社ボードからの送信文字列="12345" / Armadilloの受信文字列="2345"
rubyのgetsメソッドには、なにか問題があるようです。
以上、よろしくお願いいたします。
at_syunya.ohshio
dotsuru
at_syunya.ohshio
大塩です。
> wait時間を設定してrubyを実行したところ、
> 最初の数回は正常に受信するのですが、そのあと全く受信できなくなり
> さらに送信を続けると、OSがCrashしてリブートがかかるようになってしまいました。
>
> カーネルのVersion Up前は、リブートがかかるようなことは一度も無かったので、
> カーネルのVersion Upが原因と思われます。
>
> なお、Cで書いたほうは、問題なく動作しています。
>
状況の確認のため、なるべく同様の環境でのテストを行いたいので
お出しできる範囲で良いのですが、この現象についてのテストコードがありましたら
送付いただけますでしょうか。
以上です。
dotsuru
> 状況の確認のため、なるべく同様の環境でのテストを行いたいので
> お出しできる範囲で良いのですが、この現象についてのテストコードがありましたら
> 送付いただけますでしょうか。
お世話になっております。
問題のソースを添付いたします。
LTE経由で文字列を受け取ると、"0109"のような4byteをシリアルで弊社のボードに送信し、
"<3>\n"のような4byteの文字列を受信します。
この"<3>"の先頭の"<"が欠けてしまいます。
ファイル | ファイルの説明 |
---|---|
server_報告用.rb | Crashするソース |
at_syunya.ohshio
大塩です。
> お世話になっております。
> 問題のソースを添付いたします。
>
> 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…
以上です。
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 カーネル
・ユーザーランド
以上です。