sasaki_iwaya
2024年6月11日 13時42分
お世話になります。
現在、CON3(UART3)のD-subに9pinシリアル通信で接続されたデータ通信機器(DCE)へ、DSR/DTR制御にて設定コマンドの送信テストを行おうとしています。
armadilloコンソール上から/dev/ttymxc2へscreenコマンドで接続、コマンドの送信を行いましたが応答が返ってこない状況です。
armadillo640のインタフェース仕様においては9pinシリアル接続での各種フロー制御に対応しているように見えますが、当該通信にてDSR/DTR制御を実現するためにピンアサインが別途必要等、追加で設定が必要でしょうか。
対応方法のご教授お願い致します。
コメント
sasaki_iwaya
at_ohsawa
> ちなみに、DSR/DTRの入出力確認を行う際、GPIOを使用することは可能でしょうか?
> 可能であれば、番号を教えていただけないでしょうか?
uartのドライバから割当を外せば一応は、GPIOから
読むことはできます。
標準ではUARTのドライバにピンの制御が割当て
られているためGPIOとしては使えません。
外してしまうと、ttymxc2と/sys/class/gpio某)
という無関係なインターフェースからの制御になり
仕様が不明瞭になってバグの原因になるのと、
方向設定が自由になり、誤ってハードウェアを
破壊できるためオススメはしません。
(なのでデータと共通の/dev/ttyXからioctlで読み書きする
仕組みになっています)
どうしてもというのであれば、説明作ってみるのですが、
ioctlを呼ぶだけでgpioとは変わらないので、そのまま
使ってみることはできないでしょうか?
at_matsuzaka
松坂です。
シリアルのオープン時には、RTSとDTRはActiveの状態になりますので、通常は相手からも送信ができる状態になっています。
DCEと記載があったので気になったのですが、機器同士の接続に使用されているRS232Cケーブルは、ストレートケーブルでしょうか?
ArmadilloはDTEで相手がDCEなので、もしクロスケーブルですと出力ピン同士、入力ピン同士で接続してしまい通信ができないです。
■RS-232ポートについて
https://jp.misumi-ec.com/tech-info/categories/electric_electronic_desig…
sasaki_iwaya
ohsawa様 松坂様
ご回答ありがとうございます。
DSR/DTRの入出力確認について、pythonのpyserialでの設定・送信およびオシロスコープでの信号で確認できました。
また、RTSとDTRについてもシリアルオープン時にactiveとなることを確認しました。
ありがとうございます。
松坂様のご指摘の件ですが、相手がDCEの状態でストレートケーブルを使用していることを確認しました。
オシロスコープで確認したところ、DCEから送信する信号と、当該armadilloから送信する信号の論理が逆になっていると思われました。
追加の問い合わせとなり申し訳ありませんが、armadillo側のコンフィグで論理反転は可能でしょうか?
以上、ご教授のほどよろしくお願いします。
at_matsuzaka
松坂です。
> 追加の問い合わせとなり申し訳ありませんが、armadillo側のコンフィグで論理反転は可能でしょうか?
論理反転したいのはTXD/RXDですね?
特殊なDCEですね。。
デバイスツリーソースに以下のプロパティを設定することで、送信と受信の論理を反転することができます。
送信する信号の論理を逆にするプロパティ:fsl,inverted-tx
受信する信号の論理を逆にするプロパティ:fsl,inverted-rx
以下、プロパティの追加例です。
[ATDE ~/linux-[version]]$ vi arch/arm/boot/dts/armadillo-640.dts :(省略) &uart3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart3 &pinctrl_snvs_uart3>; status = "okay"; uart-has-rtscts; dtr-gpios = <&gpio1 00 GPIO_ACTIVE_LOW>; dsr-gpios = <&gpio5 00 GPIO_ACTIVE_LOW>; dcd-gpios = <&gpio5 02 GPIO_ACTIVE_LOW>; rng-gpios = <&gpio5 01 GPIO_ACTIVE_LOW>; fsl,inverted-tx; fsl,inverted-rx; }; :(省略)
sasaki_iwaya
at_ohsawa
2024年6月11日 14時58分
ピンアサイン等は要らないのですが、linuxのデバイスドライバが自動的に実行してくれる
ハードフロー制御は、RTS/CTSのみです。(Armadilloに限った話ではないです)
DSR/DTRはただのioctlから読めるフラグでしかないので、自分でtermios構造体を使った
プログラムを書く必要があります。(screenもDSR/DTRはシリアルポートのサブコマンド
infoで現在のピン状態が文字で表示できるだけで、フロー制御のようなwriteした時に
連動して制御線を動かす等には対応していません)
termios構造体を使ったシリアルポートのプログラミングはLinux Serial Howtoが
最も参考になります。
https://tldp.org/HOWTO/Serial-HOWTO.html
添付で私がかなり昔に実験した実装例を貼っておくので参考にしてみてください。
フロー制御っぽくやるなら、フラグをselectで待ってwrite/readに待ちが出ないように
実装すると良いと思いますが、制御ソフトを書く必要の無い装置なら
RTS/CTSが使えないか検討したほうが良いと思います。