링크 ux 직렬 조작

9974 단어 Linux
참고 글:http://blog.csdn.net/qdhuxp/article/details/1041669
실제 직렬 포트 와 위조 직렬 포트 를 구분 하 다                                                                                                            
1. ls - l ttyS * 명령 을 사용 하여 이 컴퓨터 의 모든 직렬 포트 를 표시 합 니 다.
2. cat / proc / tty / driver / serial 을 사용 하여 다음 과 같이 표시 합 니 다.
 serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:unknown port:000002F8 irq:3 2: uart:unknown port:000003E8 irq:4 3: uart:unknown port:000002E8 irq:3
ttyS 0 의 urt 값 16550 A, tx 값 과 rx 값 이 모두 0 인 것 을 발견 하여 직렬 포트 를 ttyS 0 으로 판단 합 니 다.
또는: demesg | grep ttyS * 사용 하기
termios 구 조 는 POSIX 규범 에서 정 의 된 표준 인터페이스 로 시스템 V 의 termio 인터페이스 와 유사 합 니 다. termios 형식의 데이터 구조 에서 의 값 을 설정 하고 함수 호출 을 사용 하면 터미널 인 터 페 이 스 를 제어 할 수 있 습 니 다.
음향 단말기 의 값 은 서로 다른 모델 에 따라 다음 과 같은 몇 조로 나 뉜 다.
1. 입력 모드
2. 출력 모드
3. 제어 모드
4. 로 컬 모드
5. 특수 제어 모드
struct termios
{
           tcflag_t c_iflag;
           tcflag_t c_oflag;
           tcflag_t c_cflag;  //   ,      、   、   、   
           tcflag_t c_lflag;
           cc_t           c_cc[NCCS];
};
#include 
//       termios  :
int tcgetattr(int fd, struct termios *termios_p);
//        :
int tcsetattr(int fd , int actions , const struct termios *termios_h); 

매개 변수 actions 제어 수정 방식 은 모두 세 가지 수정 방식 이 있 는데 다음 과 같다.
1. TCSANOW: 즉시 값 수정
2. TCSADRAIN: 현재 출력 이 완 료 된 후에 값 을 수정 합 니 다.
3. TCSAFLUSH: 현재 출력 이 완 료 된 후에 값 을 수정 하지만 read 에서 호출 되 지 않 은 현재 사용 가능 한 입력 은 버 립 니 다.
입력 모드
입력 모드 제어 입력 데이터 가 프로그램 에 전달 되 기 전의 처리 방식 입 니 다.termios 구조의 c 설정 을 통 해iflag 구성원 의 표지 가 그것들 을 제어 합 니 다.모든 플래그 가 정의 되 었 습 니 다.
매크로, 그리고 위치 나 방식 으로 결합 할 수 있 습 니 다.
c 에 사용 가능iflag 멤버 의 매크로 는 다음 과 같 습 니 다.
BRKINT                  입력 줄 에서 종료 상태 가 감지 되 었 을 때 중단 이 발생 합 니 다.
TGNBRK                입력 줄 의 종료 상 태 를 무시 합 니 다.
TCRNL                   받 은 리 턴 부 호 를 새 줄 로 바 꾸 고 CR 은 NL 로 전환 합 니 다.
TGNCR                  받 아들 인 새 줄 문자 무시, CR 무시
INLCR                    받 은 새 줄 부 호 를 리 턴 부호 로 변환 합 니 다.NL 등급 CR
IGNPAR                 패 리 티 검사 오류 문 자 를 무시 합 니 다.
INPCK                    받 은 문자 에 대해 패 리 티 검 사 를 실행 합 니 다.
PARMRK                패 리 티 검사 오류 에 대해 표 시 를 하 다.
ISTRIP                    받 은 모든 문 자 를 7 비트 로 줄 입 니 다.
IXOFF                      입력 에 소프트웨어 흐름 제 어 를 사용 합 니 다.
IXON                       출력 에 소프트웨어 흐름 제 어 를 사용 합 니 다.
IUCLC                    입력 한 대문자 를 소문 자로 변환 하 다
BRKINT 와 TGNBRK 로고 가 설정 되 지 않 으 면 입력 줄 의 종료 상 태 는 NULL (0X 00) 문자 로 읽 힙 니 다.
출력 모드
출력 모드 에서 출력 문 자 를 제어 하 는 처리 방식 입 니 다. 즉, 프로그램 에서 보 낸 문 자 를 직렬 포트 나 화면 으로 전달 하기 전에 어떻게 처리 하 는 지 입 니 다. c 설정 을 통 해oflag 구성원 의 표 지 는 출력 모드 를 제어 합 니 다.
OPSOT: 출력 처리 기능 열기
ONLCR: 출력 중의 줄 바 꿈 자 를 리 턴 문자 로 변환 합 니 다.
OCRNL: 리 턴 부 호 를 줄 바 꾸 기
ONOCR: 0 줄 에서 리 턴 부 호 를 출력 하지 않 습 니 다.
ONLRET: 리 턴 부 호 를 출력 하지 않 음
NLDLY: 줄 바 꿈 지연 시간 선택
CRDLY: 리 턴 문자 지연
TABDLY: 탭 지연 시간
...
출력 모드 도 많이 안 써 요.
제어 모드
제어 모드 제어 단말기 의 하드웨어 특성, ccflag 구성원 표지 설정.
CCTS_OFLOW            출력 CTS 흐름 제어
CRTS_IFLOW              입력 한 RTS 흐름 제어
CIGNORE                     제어 표지 무시
CLOCAL                        모든 모뎀 상태 줄 무시
CREAD                          문자 수신 기 사용 하기
CSIZE                            문자 크기 차단
CS5/6/7/8                       문 자 를 보 내 거나 받 을 때 5 / 6 / 7 / 8 비트 사용
CSTOPB                        각 문자 마다 두 개의 정지 비트 를 사용 합 니 다. 그렇지 않 으 면 한 자리 입 니 다.
PARODD                       짝수 검사 대신 기이 한 검사 만 사용 합 니 다.
PARENB                        패 리 티 검사 코드 사용 하기
HUPCL                          닫 을 때 끊 기
MDMBUF                       반송파 의 흐름 제어 출력
일반적으로 이런 방식 을 사용 하지 않 고 터미널 프로필 을 직접 수정 하여 하드웨어 특성 을 수정 하 는 것 이 쉽다.
로 컬 모드
c 통과 하기lflag 구성원 제어 단말기 의 일부 특성
ECHO: 입력 문자 의 로 컬 리 턴 기능 사용
ECHONL: 줄 바 꾸 기 표시
ICANON: 표준 입력 처리 사용
ISIG: 신호 사용
직렬 설정 프로 세 스:
//0、    
//O_NOCTTY:  linux  ,                 .
//O_NDELAY:  linux     DCD        (              ).
fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
//              ,           , fcntl  :
 fcntl(fd,F_SETFL,0);  //F_SETFL:    flag 0,   ,     
//                      ,              .
  isatty(STDIN_FILENO);

//1、        
 struct termios newtio,oldtio;
 tcgetattr(fd,&oldtio);

//2、      CLOCAL CREAD,           
newtio.c_cflag | = CLOCAL | CREAD;

//3、     
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200); 

//4、     
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;

//5、      
//     :
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
//     :
newtio.c_iflag |= (INPCK|ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag |= ~PARODD;

//6、     
//     1,   CSTOPB,     2,   CSTOPB
newtio.c_cflag &= ~CSTOPB;  //1   

//7、           ,                 ,   0
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN]  = 0;

//8、          
//tcflush    (  )    (          ,        )     (       ,     ).
//int tcflush(int filedes,int quene)
 //quene            :
 //   *TCIFLUSH        
 //   *TCOFLUSH        
 //   *TCIOFLUSH     、    
tcflush(fd,TCIFLUSH);

//9、     int tcsetattr(int filedes,int opt,const struct termios *termptr);
//opt                
// *TCSANOW:      
//  *TCSADRAIN:             。              
//  *TCSAFLUSH:             。    ,                   (  ).
tcsetattr(fd,TCSANOW,&newtio);
ps:
VMIN 은 읽 을 최소 바이트 수 를 정의 합 니 다. read () 는 VMIN 바이트 데 이 터 를 읽 거나 신 호 를 받 아야 되 돌아 갑 니 다.
하면, 만약, 만약...
VTIME
화해시키다
VMIN
도취
0
어떤 데이터 도 읽 지 못 하 더 라 도 함수
read
바로 돌아 올 겁 니 다.동시에, 반환 값
0
나타내다
read
함 수 는 파일 이 끝 날 때 까지 기다 릴 필요 가 없습니다.
전체 버 전:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio,oldtio;
    if  ( tcgetattr( fd,&oldtio)  !=  0) 
    { 
        perror("SetupSerial 1");
        return -1;
    }
    bzero( &newtio, sizeof( newtio ) );
    newtio.c_cflag  |=  CLOCAL | CREAD; 
    newtio.c_cflag &= ~CSIZE; 

    switch( nBits )
    {
    case 7:
        newtio.c_cflag |= CS7;
        break;
    case 8:
        newtio.c_cflag |= CS8;
        break;
    }

    switch( nEvent )
    {
    case 'O':                     //   
        newtio.c_cflag |= PARENB;
        newtio.c_cflag |= PARODD;
        newtio.c_iflag |= (INPCK | ISTRIP);
        break;
    case 'E':                     //   
        newtio.c_iflag |= (INPCK | ISTRIP);
        newtio.c_cflag |= PARENB;
        newtio.c_cflag &= ~PARODD;
        break;
    case 'N':                    //   
        newtio.c_cflag &= ~PARENB;
        break;
    }

switch( nSpeed )
    {
    case 2400:
        cfsetispeed(&newtio, B2400);
        cfsetospeed(&newtio, B2400);
        break;
    case 4800:
        cfsetispeed(&newtio, B4800);
        cfsetospeed(&newtio, B4800);
        break;
    case 9600:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    case 115200:
        cfsetispeed(&newtio, B115200);
        cfsetospeed(&newtio, B115200);
        break;
    default:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    }
    if( nStop == 1 )
    {
        newtio.c_cflag &=  ~CSTOPB;
    }
    else if ( nStop == 2 )
    {
        newtio.c_cflag |=  CSTOPB;
    }
    newtio.c_cc[VTIME]  = 0;
    newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");
        return -1;
    }
    printf("set done!
"); return 0; } int open_port(int fd,int comport) { char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"}; long vdisable; if (comport==1) { fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY); if (-1 == fd) { perror("Can't Open Serial Port"); return(-1); } else { printf("open ttyS0 .....
"); } } else if(comport==2) { fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY); if (-1 == fd) { perror("Can't Open Serial Port"); return(-1); } else { printf("open ttyS1 .....
"); } } else if (comport==3) { fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY); if (-1 == fd) { perror("Can't Open Serial Port"); return(-1); } else { printf("open ttyS2 .....
"); } } if(fcntl(fd, F_SETFL, 0)<0) { printf("fcntl failed!
"); } else { printf("fcntl=%d
",fcntl(fd, F_SETFL,0)); } if(isatty(STDIN_FILENO)==0) { printf("standard input is not a terminal device
"); } else { printf("isatty success!
"); } printf("fd-open=%d
",fd); return fd; } int main(void) { int fd; int nread,i; char buff[]="Hello
"; if((fd=open_port(fd,1))<0) { perror("open_port error"); return; } if((i=set_opt(fd,115200,8,'N',1))<0) { perror("set_opt error"); return; } printf("fd=%d
",fd); nread=read(fd,buff,8); printf("nread=%d,%s
",nread,buff); close(fd); return; }

좋은 웹페이지 즐겨찾기