링크 ux 직렬 조작
9974 단어 Linux
실제 직렬 포트 와 위조 직렬 포트 를 구분 하 다
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.