[Armadillo:01694] Armadillo-300のSerialPortBについて

中川祥裕 email@hidden
2007年 7月 2日 (月) 13:48:24 JST


シリアルポートで外部機器との通信をしていたのですが、
通常にtermios構造体を書き換えて通信しようとすると、
受信のみうまくいきませんでした。
オシロスコープで調査したところ、RTS信号が、プログラム動作前はスペース、
プログラムを動かすとマークされ、終了するとスペースに戻りました。
使用しているものがRTS/CTSフロー制御をおこなうハードウェアなので、
プログラムが終了してから、信号を受信していました。

現状としてはioctl関数を使用して直接RTS信号をスペースにして解決しているのですが、
問題ないものでしょうか。

ポートの設定部分のプログラムは次の通りです。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <asm/termios.h>
/* 本来は<termios.h>から<ssm/termios.h>をインクルードすべき。
RTS信号を操作する為直接<asm/termios.h>をインクルードしている。*/
#include <stdio.h>
#include <string.h>
#include <asm/ioctls.h>
#include <asm/ioctl.h>

#define BAUDRATE B9600            
/* 適切なシリアルポートを指すように,この定義を変更する.*/
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1  /* POSIX 準拠のソース */

#define FALSE 0
#define TRUE 1

struct termios oldtio,newtio;
/*
 * portopen関数
 * 機能:シリアルポートの初期設定と開放
 * 戻り値:デバイスポインタfd
 */
int portopen()
{
	int fd;
	int i = 0;
	unsigned int rts_bit = TIOCM_RTS;
	
	fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); 
	if (fd <0) {perror(MODEMDEVICE); exit(-1); }

	tcgetattr(fd,&oldtio); /* 現在のシリアルポートの設定を待避させる*/
	bzero(&newtio, sizeof(newtio)); /* 新しいポートの設定の構造体をクリアする */

	newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD ;
 
	newtio.c_iflag = 0 ;
 
	newtio.c_oflag = 0 ;
 
	newtio.c_lflag = 0 ;
 
	newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */ 
	newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
	newtio.c_cc[VERASE]   = 0;     /* del */
	newtio.c_cc[VKILL]    = 0;     /* @ */
	newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
	newtio.c_cc[VTIME]    = 10;    /* キャラクタ間タイマ */
	newtio.c_cc[VMIN]     = 0;     /* n文字来るまで,読み込みをブロックする */
	newtio.c_cc[VSWTC]    = 0;     /* '\0' */
	newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */ 
	newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
	newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
	newtio.c_cc[VEOL]     = 0;     /* '\0' */
	newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
	newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
	newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
	newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
	newtio.c_cc[VEOL2]    = 0;     /* '\0' */

/* 
  モデムラインをクリアし,ポートの設定を有効にする
*/
	tcflush(fd, TCIFLUSH);
	tcsetattr(fd,TCSANOW,&newtio);
/*
 RTS信号を強制的にスペースに
*/
	ioctl(fd, TIOCMBIC, &rts_bit);
/*
  端末の設定終了.入力を処理するできるようになった.
*/
	return fd;
}

----
中川祥裕  email@hidden




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