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