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

nakai email@hidden
2010年 7月 15日 (木) 12:20:06 JST


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 メーリングリストの案内