[Armadillo:05444] Re: DMA転送を有効にした場合のシリアル通信プログラムについて

Myoukan Kiyohito email@hidden
2010年 7月 15日 (木) 14:53:35 JST


明官です。

> > 確認したところ、read関数でエラー(-1)が返ってくることがわかりました。
> -1で返ってきたときのerrnoは何に設定されているのでしょうか?
→「read関数でエラー(-1)が返ってくる」と書きましたが誤りがありました。
 read関数がエラーになったのは、シリアルインターフェースが間違っていたからでし
た。
 ("/dev/ttyS0"にしていたため、「Bad file descriptor」というエラーが出ていまし
た)
 
 シリアルインターフェースを"/dev/ttymxc2"とし、再度確認したところ
 「read関数で受信できていない」ということがわかりました。
 read関数で止まったまま、PCからデータを送信しても反応しません。
 (エラーも発生せず、受信待ちのままになっています)

> また、open時にエラーチェックされていないためわかりかねますが、
> ある程度文字列が表示されてから、
> readがエラーとなるのでしょうか?
> それとも、1発目のreadでエラーになりますか?
→全く表示しません。1発目のread関数で止まったままです。

以上です。よろしくお願いいたします。

> -----Original Message-----
> From: email@hidden
> [mailto:email@hidden] On Behalf Of nakai
> Sent: Thursday, July 15, 2010 12:20 PM
> To: Armadillo series general discussion list
> Subject: [Armadillo:05439] Re: DMA転送を有効にした場合のシリアル通信プログラム
> について
>
> nakaiです。
>
> 実機で確認できていないのですが、、
> > 確認したところ、read関数でエラー(-1)が返ってくることがわかりました。
> -1で返ってきたときのerrnoは何に設定されているのでしょうか?
>
> また、open時にエラーチェックされていないためわかりかねますが、
> ある程度文字列が表示されてから、
> readがエラーとなるのでしょうか?
> それとも、1発目のreadでエラーになりますか?
>
>
> DMA有効時のシリアル転送には、まだバグがある可能性があります。
>
>
>
>
> (2010/07/13 9:38), Myoukan Kiyohito wrote:
> > 明官と申します。
> >
> > C言語のプログラムはある程度かけますが、
> > Linux,Armadilloに関しては初心者です。
> >
> > Armadillo420でDMA転送を有効にしてシリアル通信のテストを行ったところ
> > うまく動作しませんでした。
> > 確認したところ、read関数でエラー(-1)が返ってくることがわかりました。
> >
> > DMA転送を使用した場合は、単純にread関数で受信することはできないのでしょう
> か?
> > 参考になる情報がありましたら、ご教授お願いいたします。
> >
> > <テスト>
> > ・接続は、PCとArmadillo420をシリアルクロスで接続。
> > ・PCから送信した文字をArmadillo420で受信し表示するプログラムを使用。
> > ・シリアルインターフェース2を使用。
> > ・転送速度は38400bps。
> > ・DMA転送の設定は、linux2.6.x/arch/arm/mach-mx25/serial.h の
> >  UART3_DMA_ENABLE=1
> >  とすることで、有効にしました。
> >
> > <テストプログラム>
> > #include<stdio.h>
> > #include<sys/types.h>
> > #include<sys/stat.h>
> > #include<fcntl.h>
> > #include<termios.h>
> >
> > #define SERIAL_PORT "/dev/ttymxc2"
> > #define FALSE 0
> > #define TRUE 1
> > volatile int STOP=FALSE;
> >
> > int main()
> > {
> >      char buf[255];                    /* バッファ */
> >      int fd=0;                           /* ファイルディスクリプタ */
> >      struct termios oldtio, newtio;    /* シリアル通信設定 */
> >      int res;
> >
> >      fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);   /* デバイスをオープンする
*/
> >      tcgetattr(fd,&oldtio); /* 現在のシリアルポートの設定を待避させる*/
> >      bzero(&newtio, sizeof(newtio)); /* 新しいポートの設定の構造体をクリアす
> る */
> >
> >      newtio = oldtio;                  /* ポートの設定をコピー */
> >      newtio.c_cflag = B38400 | CS8 | CLOCAL | CREAD;
> >      newtio.c_iflag = IGNPAR ;
> >      newtio.c_oflag = 0;
> >      newtio.c_lflag = ICANON;
> >
> >      tcflush(fd, TCIFLUSH);
> >      tcsetattr(fd,TCSANOW,&newtio);
> >
> >      while (STOP==FALSE) {     /* 終了条件が満たされるまでループ */
> >         if((res = read(fd,buf,255)) == -1){
> >             printf("read error\n");
> >             continue;
> >         }
> >         write(fd,buf,res);
> >         buf[res]=0;             /* printf で使うため,文字列の終端をセットす
> る */
> >         printf(":%s:%d\n", buf, res);
> >         if (buf[0]=='z') STOP=TRUE;
> >      }
> >      /* ポートの設定をプログラム開始時のものに戻す */
> >      sleep(1);
> >      tcsetattr(fd,TCSANOW,&oldtio);
> >      close(fd);
> >      return 0;
> > }
> >
> > 以上、よろしくお願いいたします。
> >
> > _______________________________________________
> > armadillo mailing list
> > email@hidden
> > http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> >
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo




armadillo メーリングリストの案内