[Armadillo:05424] DMA転送を有効にした場合のシリアル通信プログラムについて
Myoukan Kiyohito
email@hidden
2010年 7月 13日 (火) 09:38:10 JST
明官と申します。
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 メーリングリストの案内