2002年11月18日

[obu:02041] Re: シリアルからのデータ通信

訂正:さきほど、送りましたソースコード中に、デバイス指定が、「/dev/ttyS0」
となっていましたが、「/dev/ttyS1」の間違えです。RedHatで確認していたソー
スを貼り付けてしまいましたので。申し訳ありません。

よろしくお願いします。


皆様、アドバイスありがとうございます。


島田です。

色々、試しては見ましたが、どの例を見ても、他のRedHat7.3のディスクトップ
では動作するのですが、OBSSに持ってくると動きません。

> > 一つ質問なのですが、setserialで以下のように、ttyS1の情報を引き出したら、
> > ボーレートの数字が、変な値になっていました。これも、Intel系の構造と違う
> > ので、このようになっているのか、もしくは、ボーレート4800で通信するに
> > は、これではいけないのか、どちらでしょうか
> どうせCでプログラムするのですから、setserialの動作が正しいかどうか
> すら微妙なのであれば、確かめるのは後まわしにしませんか?(^^;)
確かにそうですよね。

> 私なら簡単なテストプログラムでまず出力されるか確認します。
> ルーチンの戻り値など観察すればいろんな情報が取れますしね。
> そのあと入力を試します。
以下の簡単なプログラムで確認しております。RedHatの入ったディスクトップで
はデータが取れましたが、OBSSでは取れません。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static int ch;

int open_serial(void){

struct termio t;

printf("Open GPS Device\n");
if((ch=open("/dev/ttyS1",O_RDWR))<0){
perror("* Can't open RS-232C-0 port\n");
return(-1);
}
printf("success opened.\n");
bzero( &t, sizeof(t) );
t.c_cflag = B4800 | CS8 | CLOCAL | CREAD ;
t.c_iflag = IGNPAR ;
t.c_oflag = 0 ;
t.c_lflag = ICANON ;

if(ioctl(ch,TCSETA,&t)<0){
perror("* ioctl error\n");
return(-2);
}

printf("init[%d] : done.\n",ch);
return 0;
}

unsigned char _get_gps_char(int ch)
{
unsigned char c ;
if(read(ch,&c,1)==-1){
printf("Error read\n");
}
//printf("%c",c);
return c;
}

int main(void){
int i;
unsigned char c;

if(open_serial()<0)
printf("Open Error\n");

for( i = 0 ; i < 1000 ; i ++ ){
c = _get_gps_char(ch);
printf("%c",c);
}
}

デバイスのオープン方法に問題があるのでしょうか?

> (でもRedHat7.2(AT機)では成功してるんですよね?うーむ・・)
私のほうでも、「cat /dev/ttyS0」のように、シリアル通信すると、データが飛
び込んできました。垂れ流しで。

度々で、申し訳ありませんが、よろしくお願いします。

投稿者 xml-rpc : 2002年11月18日 18:36
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/8040
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。