[Armadillo:05446] Re: DMA転送を有効にした場合のシリアル通信プログラムについて
nakai
email@hidden
2010年 7月 15日 (木) 18:12:06 JST
nakaiです。
たぶん確認済みだとは思いますが、
>>> newtio.c_lflag = ICANON;
カノニカルモードを指定しているので、PC側からは改行コードを含む
文字列を転送していますよね?
そうでない場合は、改行が入らなければReadはできないので確認してみてください。
参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/termios.3.html
あとは、
・ポートの場所
ttymxc2は、基板の内側の方(1,3,5,7,9ピン)で、
ttymxc4は、基板の外側の方(2,4,6,8,10ピン)となります。
・5pinシリアル変換ケーブルの接続
などの確認をお願いします。
また、
stty -F /dev/ttymxc2 38400
echo "Test" > /dev/ttymxc2
と実行した場合、PC側にメッセージ"TEST"が表示されるでしょうか?
PC側は、TeraTermなどで受信させてみてください。
(2010/07/15 14:53), Myoukan Kiyohito wrote:
> 明官です。
>
>>> 確認したところ、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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
armadillo メーリングリストの案内