Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q]RS-232をバッファリングさせない 方法

323 views
Skip to first unread message

Momochan

unread,
Oct 11, 1999, 3:00:00 AM10/11/99
to
ちょくちょくお世話になってます。百瀬ともうします。

現在、ワンチップマイコンのクロス開発環境をSS20に乗せようとして
います。ターゲットのCPUボードにシリアルで書き込みをするわけで
すが、これがうまく動きません。

CPUボードはRSのSPEEDを自動認識し、認識完了の合図として1
Byteの0x00を送信してきます。どうもこれが拾えていないようです。

書き込みプログラムはFreeWareなので、その通信部分だけ取り出
し、PCとクロスケーブルで接続してテストしてみたところ、PCから
1Byte送信しても書き込みプログラム通信部のselect()ではそれを
検知できませんでした。
4byte程度送信すると、select()が反応しました。

どうもRSがバッファリングしているのではないかと思うのです。
シリアルコンソールのように、即座に認識させるにはRSをどのように
設定すれば良いのでしょうか。

よろしくお願いします。

--------------------
Hirofumi Momose


Nagata Yoshihiro

unread,
Oct 11, 1999, 3:00:00 AM10/11/99
to
長田@柿生です。

週明けには、正解フォローあると思いますが、一応

<38017B8D...@ma.neweb.ne.jp>の記事において
mom...@ma.neweb.ne.jpさんは書きました。

>> どうもRSがバッファリングしているのではないかと思うのです。

大昔の Sun じゃない UNIX では、
stty eof ctrl-A とすると、一文字入力出来た記憶があります。
#当時調べてて、なんでだ?とすごく疑問でした。

あと簡単なのは、 raw モードにしてしまうとか。

# ioctl が面倒なので、大抵、 スクリプトでごまかしてます。

P.S. と書いてから、
いま、SunOS 4.1.x ですが、動作確認しました。
W1% tty
/dev/ttyp7
W1% sleep 300000 ; # そして別ウィンドウで、

W2% cat /dev/ttyp7 ; # ここで、 ttyp7 に入力すると Buffred
W2% stty -icanon > /dev/ttyp7 ; # これでも4文字づつでてくる。
W2% stty eof ^A > /dev/ttyp7 ;!ca ; これで OK

#なぜ、raw を嫌うかというと、ctrl-C が効かなくなるから(笑)
# Solaris 2.x では stty > の向きが逆でしょう、確か。
--
yna...@st.rim.or.jp /* 斉藤慶子と、Belldandy, 巫女さん姿の mars が一番 */
4 byte ってのが、ちょうど、 ctrl-D と同じですよね。 (eof default)

Momochan

unread,
Oct 12, 1999, 3:00:00 AM10/12/99
to
百瀬です。

重要なことを書き忘れていました。

OSは Solaris2.6で、コンパイルはgcc2.8.1でやってます。
書き込みソフトはCでできていて、オリジナルはlinux(x86)用に作られて
います。
以下のようにシリアルをオープンしてます。(不要な部分は省いてます。)
cfmakeraw()という関数がシリアルをrawモードにしていそうです。これは
solarisには無かったので、linuxのmanページを参照に作りました。


void cfmakeraw(struct termios *t)
{
t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR
|ICRNL|IXON);
t->c_oflag &= ~OPOST;
t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
t->c_cflag &= ~(CSIZE|PARENB);
t->c_cflag |= CS8;
}

int commfd;
void init_comm()
{
struct termios termios;

commfd = open("/dev/cua/b", B9600);
tcsetpgrp(commfd,getpgrp());
tcgetattr(commfd,&termios);
termios.c_cflag|=HUPCL|CLOCAL
termios.c_cflag&=~(PARENB|CSTOPB);
cfmakeraw(&termios);
tcsetattr(commfd,TCSANOW,&termios);
}

--------------------
Hirofumi Momose

MORI Kouji

unread,
Oct 12, 1999, 3:00:00 AM10/12/99
to
Momochan <mom...@ma.neweb.ne.jp> writes:

> commfd = open("/dev/cua/b", B9600);

これだと O_WRONLY|O_NDELAY|O_APPEND で open してることになりそうです。
open(2) のマニュアルを参照しましょう。

--
森 浩二 (MORI Kouji)
(株)淺沼組 技術研究所
E-mail: mo...@tri.asanuma.co.jp

popo

unread,
Oct 12, 1999, 3:00:00 AM10/12/99
to
こんにちは、坂本といいます。

Momochan <mom...@ma.neweb.ne.jp> wrote in message
news:380212F1...@ma.neweb.ne.jp...
> 百瀬です。


> OSは Solaris2.6で、コンパイルはgcc2.8.1でやってます。
> 書き込みソフトはCでできていて、オリジナルはlinux(x86)用に作られて
> います。
> 以下のようにシリアルをオープンしてます。(不要な部分は省いてます。)
> cfmakeraw()という関数がシリアルをrawモードにしていそうです。これは
> solarisには無かったので、linuxのmanページを参照に作りました。
>
>
> void cfmakeraw(struct termios *t)
> {
> t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR
> |ICRNL|IXON);
> t->c_oflag &= ~OPOST;
> t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
> t->c_cflag &= ~(CSIZE|PARENB);
> t->c_cflag |= CS8;
> }

VMINを設定していないので、EOFに設定してある^D=4(文字)を設定したことに
なる。
c_cc[VMIN]だったかな。
ついでにVTIME(VTIMだったかな?)も設定しましょう。

VMIN=指定文字数入力で入力から抜ける。ただし0は待たない
VTIME=指定時間(単位は0.1秒)後入力から抜ける。ただし0は無限待ち


Momochan

unread,
Oct 13, 1999, 3:00:00 AM10/13/99
to
百瀬です。

MORI Kouji wrote:

> Momochan <mom...@ma.neweb.ne.jp> writes:
>
> > commfd = open("/dev/cua/b", B9600);
>
> これだと O_WRONLY|O_NDELAY|O_APPEND で open してることになりそうです。
> open(2) のマニュアルを参照しましょう。

すいません。これ投稿時の記述ミスです。B9600ではなくO_RDWRになってます。
#openでボーレートなんか設定できません。

最初はこのあたりを疑ってビットをいじってみたのですが、だめでした。
結局、坂本さんがおっしゃっている部分(termiosのc_ccのVMINとVTIME)
でした。

-----------------------------
Hirofumi Momose

Momochan

unread,
Oct 13, 1999, 3:00:00 AM10/13/99
to
百瀬です。

popo wrote:

> こんにちは、坂本といいます。

..snipped..

> VMINを設定していないので、EOFに設定してある^D=4(文字)を設定したことに
> なる。
> c_cc[VMIN]だったかな。
> ついでにVTIME(VTIMだったかな?)も設定しましょう。
>
> VMIN=指定文字数入力で入力から抜ける。ただし0は待たない
> VTIME=指定時間(単位は0.1秒)後入力から抜ける。ただし0は無限待ち

まさにこれでした。1byteでも返ってきます。すばらしい。
最初はどこが問題なのか見当も付かず、RSの信号をオシロで探ったり
エンジニアな週末でした。

とうもありがとうございました。

--------------------------
Hirofumi Momose


0 new messages