現在、ワンチップマイコンのクロス開発環境をSS20に乗せようとして
います。ターゲットのCPUボードにシリアルで書き込みをするわけで
すが、これがうまく動きません。
CPUボードはRSのSPEEDを自動認識し、認識完了の合図として1
Byteの0x00を送信してきます。どうもこれが拾えていないようです。
書き込みプログラムはFreeWareなので、その通信部分だけ取り出
し、PCとクロスケーブルで接続してテストしてみたところ、PCから
1Byte送信しても書き込みプログラム通信部のselect()ではそれを
検知できませんでした。
4byte程度送信すると、select()が反応しました。
どうもRSがバッファリングしているのではないかと思うのです。
シリアルコンソールのように、即座に認識させるにはRSをどのように
設定すれば良いのでしょうか。
よろしくお願いします。
--------------------
Hirofumi Momose
週明けには、正解フォローあると思いますが、一応
<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)
重要なことを書き忘れていました。
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
> commfd = open("/dev/cua/b", B9600);
これだと O_WRONLY|O_NDELAY|O_APPEND で open してることになりそうです。
open(2) のマニュアルを参照しましょう。
--
森 浩二 (MORI Kouji)
(株)淺沼組 技術研究所
E-mail: mo...@tri.asanuma.co.jp
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は無限待ち
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
popo wrote:
> こんにちは、坂本といいます。
..snipped..
> VMINを設定していないので、EOFに設定してある^D=4(文字)を設定したことに
> なる。
> c_cc[VMIN]だったかな。
> ついでにVTIME(VTIMだったかな?)も設定しましょう。
>
> VMIN=指定文字数入力で入力から抜ける。ただし0は待たない
> VTIME=指定時間(単位は0.1秒)後入力から抜ける。ただし0は無限待ち
まさにこれでした。1byteでも返ってきます。すばらしい。
最初はどこが問題なのか見当も付かず、RSの信号をオシロで探ったり
エンジニアな週末でした。
とうもありがとうございました。
--------------------------
Hirofumi Momose