[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:96720] Re: シリアル通信中のRTS端子の制御


今井です.
# 竹内さんには個人メイルでここらは説明したのですが,また盛り上がっている
# ようなので,もう一度.

On Thu, 5 Dec 2002 18:52:32 +0900
Yoshinari NOMURA <nom _at_ csce.kyushu-u.ac.jp> wrote:

> 16550 の FIFO 無し版である 16450 としてドライバをセットアップす
> れば,FIFO が無効になって,上の手が使えるかもしれません.

残念ながら「正確には」知ることはできません.

16550 モードの場合,

                      byte
                       ↓
                [ | | | | | | | ]
FIFO            [ | | | | | | | ] 
= 16 byte              ...
                [ | | | | | | | ] 
                [ | | | | | | | ] ** ここが空になったことはわかる
                       ↓
シフト          [ | | | | | | | ] → TxD
レジスタ

16550 のレジスタの状態や,割り込みの通知によって,FIFO のバッファが空
になったとことはわかるのですが,シフトレジスタからビット列が抜け切った
ところまでは検出することはできません.


16450 モードの場合,

                     byte
ホールディング        ↓
レジスタ      [ | | | | | | | ] ** ここが空になったことはわかる
                      ↓
シフト        [ | | | | | | | ] → TxD
レジスタ

16byte の FIFO が 1byte のホールディングレジスタに変わっただけで,状況
は変わらなかったりします.

というわけで,16550 モードや 16450 モードのいかんに関わらず,結局は
「FIFO やホールディングバッファが空になってから,1byte 分の送信時間後
に SYN を下ろす」という手段しかありません.


ならば,ユーザ空間のプログラムの usleep() などでこのタイミングを取れば
いい,ということになるかもしれませんが,これがうまくいきません.
確かに usleep() 自体はマイクロ秒単位の引数を取りますが,Linux 自体は
10ms ( = 1/HZ ) 刻みでしか sleep してくれません.

となると,シリアルのドライバに手を入れるしかないんじゃないのかな,と思
います.

あとは,PIC や AVR なんかでシリアルが2ポートある石があれば,これをつな
いで SYN 信号を生成させる,という手もあると思います.

というところまで書いたところで,かなりバカバカしい方法を思いつきました.

         --------  ttyS0, TxD
        |PC      +---------+------> 機器
        |        |         |
        |        +<--------
         --------  ttyS1, RxD

送信の信号線を分岐させて,もう1つのシリアルポートの受信の端子に入力して
やります.
「受信」のほうは,16450 モードに設定すれば,1 byte 受信完了で直ちに
割り込みがかかるので,これで「送信完了」を知ることができます.

プログラムは,ttyS1 側を O_NONBLOCK オプション無しで open したとして

	syn_up(); /* SYN を上げる処理 */
	write ( fd0, &c0, 1 );
	read ( fd1, &c1, 1 );
	syn_donw(); /* SYN を下げる処理 */

という感じになると思います.
write() はデータの送信,read() は送信完了を待つだけのダミーです.

でわでわ
_._. __._  _ . ... _  .___ ._. _____ _... ._ _._ _.._. .____  _ . ... _

                                                          Kunihiko IMAI
                                                              今井 邦彦

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: