h.o
2020年11月13日 14時29分
みなさん、初めまして。
IoT G3でRS485(RS02)を使ったC++アプリケーションを開発しています。
シリアル設定は1200bps,8n1です。
1秒間隔で、ttymxc0をopen、flock、コマンドを送信して応答を受け取る、そしてunlock、close
という処理を行おうとしています。
(毎度、open/closeしているのはこのラインを複数のプロセスで共有するためです)
特に難しいことはしていないつもりなのですが、openした後25ミリ秒程度以上のsleepを入れないと応答が受信できず、受信タイムアウトとなります。
事情があって、今はオシロで観測することができない状況で恐縮なのですが、コマンドの送出は出来ているように見えます。
25ミリ秒のディレイを入れることは問題ないのですが、この時間が何のためなのか判らないと、動けばいいでしょと言うわけには参りません。
どなたか、このディレイについて御教授頂けませんでしょうか。
コメント
at_syunya.ohshio
大塩です。
> (すみません、操作を間違えて余計なコメントを送信してしまいました。)
>
> 誤報がありましたので訂正いたします。
> > ...コマンドの送出は出来ているように見えます。
> と記しましたが、
> open, コマンド送信, 25ミリ秒スリープ, 応答受信, close
> の順ではだめでした。
> また、
> open, コマンド送信, (25ミリ秒スリープ, コマンド送信){1~3回繰り返し}, 応答受信, close
> もだめでした。
> どうやらopen直後にウェイトを入れないと固まってしまうようです。
返答が遅れて申し訳ありません。
確認させていただきたいことがございます。
以下内容についてご回答または送付いただけますでしょうか。
・ご利用のイメージバージョン
使用したインストールディスクのバージョン または
以下コマンドの結果をお教えください。
uname -a dpkg -l | grep atmark
・RS02 の設定
RS02 の通信設定は、半二重 と 全二重 どちらに設定されているでしょうか。
・作成されたC++のコード
公開できるのであれば、デバイスのopen ~ close までの範囲のみで良いので
お客様が作成されたC++のコードを送付いただけますでしょうか。
以上です。
大塩様
ご返信ありがとうございます。
ご請求いただいた情報を記します。
> uname -a
Linux armadillo 4.9.133-at16-**** #6 SMP PREEMPT Fri Oct 30 11:12:58 JST 2020 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
> ・RS02 の設定
> RS02 の通信設定は、半二重 と 全二重 どちらに設定されているでしょうか。
半二重で使用しております。
> ・作成されたC++のコード
> 公開できるのであれば、デバイスのopen ~ close までの範囲のみで良いので
> お客様が作成されたC++のコードを送付いただけますでしょうか。
現象を再現できるコードを作成しましたので添付いたします。
mainループのusleep (25*1000)の有無で動作が異なってきます。
このsleepありだと、期待した動作になりますが、
なしだったり22ms以下だと、確実に"no data"が返ります。
追記:
試しに通信速度を9600bpsに変えたところ、待ち時間が1.6ミリ秒で動作するようになりました。
1/8になるかもと考えたのですが、それよりさらに短時間になってます。
ただ、待ち時間がボーレートに関係しているのは間違いないようです。
以上、よろしくお願いします。
ファイル | ファイルの説明 |
---|---|
main.cpp |
at_syunya.ohshio
大塩です。
返答が遅くなり申し訳ございません。
> ご請求いただいた情報を記します。
>
> > uname -a
> Linux armadillo 4.9.133-at16-**** #6 SMP PREEMPT Fri Oct 30 11:12:58 JST 2020 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
>
> > ・RS02 の設定
> > RS02 の通信設定は、半二重 と 全二重 どちらに設定されているでしょうか。
> 半二重で使用しております。
>
> > ・作成されたC++のコード
> > 公開できるのであれば、デバイスのopen ~ close までの範囲のみで良いので
> > お客様が作成されたC++のコードを送付いただけますでしょうか。
>
> 現象を再現できるコードを作成しましたので添付いたします。
> mainループのusleep (25*1000)の有無で動作が異なってきます。
> このsleepありだと、期待した動作になりますが、
> なしだったり22ms以下だと、確実に"no data"が返ります。
>
> 追記:
> 試しに通信速度を9600bpsに変えたところ、待ち時間が1.6ミリ秒で動作するようになりました。
> 1/8になるかもと考えたのですが、それよりさらに短時間になってます。
> ただ、待ち時間がボーレートに関係しているのは間違いないようです。
>
> 以上、よろしくお願いします。
各情報ありがとうございます。
頂いた main.cpp をこちらで動作させてみたところ、usleepをコメントアウトして動作させても対向機側からのデータを取得できました。
使用したArmadillo-IoT G3はお客様から頂いた情報と同様の物を使用しました。
以下、こちらで確認した対向機の情報と確認方法です。
***************************************
■対向機
機器:Armadillo-IoT G3L(最新カーネル)
RS485設定:半二重
ボーレート設定:1200
■確認方法
Armadillo-IoT G3 にて main.cpp を動作させ、対向機(Armadillo-IoT G3L)に「#010」が流れてくることをチェックし、適当な文字列を流し続ける
***************************************
上記結果のため、対向機側を確認する必要があると考えております。
対向機の通信仕様と設定をご確認いただけますでしょうか。
以上です。
大塩さま
お手数をおかけします。
追試ありがとうございました。
こちらでもようやくオシロ等を使って状況を調べることができましたのでご報告いたします。
試験環境は、
PC⇔USB/RS232変換器⇔RS232/RS485変換器⇔デバイス⇔Armadillo(RS02)
となっています。この状態でRS485の±にオシロをつないで観察しました。
結果は、
・Open後のディレイ有無でオシロに見える波形に差異はありません。
・Open後のディレイ有無でPC側モニター(teraterm)に表示されるコマンド、応答ともに差異はありません。
→ディレイがあろうとなかろうと、Aramadilloからは"#010\r"が出力されています。
→このコマンドを受けてデバイスは正常に応答を返しています。
・Aramdilloの動作(↑のサンプルソフト)はディレイなしでは応答を受信しません。ディレイありだと期待した動作となります。
大塩さまの追試環境では問題ないとのことですが、こちらの状況とは少し異なるようです。
デバドラやらLinux内部まで潜って調べる力量はなく、困っております。
参考になるかわかりませんが、オシロの波形を添付いたします。
以上、よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
DS1Z_QuickPrint4.png | |
DS1Z_QuickPrint3.png |
h.o
2020年11月13日 14時30分
> みなさん、初めまして。
> IoT G3でRS485(RS02)を使ったC++アプリケーションを開発しています。
> シリアル設定は1200bps,8n1です。
> 1秒間隔で、ttymxc0をopen、flock、コマンドを送信して応答を受け取る、そしてunlock、close
> という処理を行おうとしています。
> (毎度、open/closeしているのはこのラインを複数のプロセスで共有するためです)
> 特に難しいことはしていないつもりなのですが、openした後25ミリ秒程度以上のsleepを入れないと応答が受信できず、受信タイムアウトとなります。
> 事情があって、今はオシロで観測することができない状況で恐縮なのですが、コマンドの送出は出来ているように見えます。
> 25ミリ秒のディレイを入れることは問題ないのですが、この時間が何のためなのか判らないと、動けばいいでしょと言うわけには参りません。
> どなたか、このディレイについて御教授頂けませんでしょうか。