크 랜 베 리 파이 4 직렬 설정 및 사용

6121 단어 linux
글 목록
  • 직렬 포트 의 기능 변경
  • 직렬 포트
  • 크 랜 베 리 파이 재 개
  • minicom 설치
  • minicom 통신 사용
  • 트 리 베 리 파 이 를 연결 하 는 코드 작성
  • 직렬 코드 열기
  • 직렬 코드 설정
  • 직렬 코드 닫 기
  • 직렬 포트 읽 기
  • 직렬 포트 기능 변경
    sudo nano /boot/cmdline.txt
       console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
    

    꿰매다
    sudo nano /boot/config.txt
             :
    dtoverlay=pi3-miniuart-bt
    enable_uart=1
    

    크 랜 베 리 파이 다시 시작
    minicom 설치
    sudo apt-get install minicom
    

    minicom 통신 사용
    minicom -b 9600 -o -D /dev/ttyAMA0
    -b        -D       -o   ,     
    

    트 리 베 리 파 이 를 연결 하 는 코드 를 작성 합 니 다.
    직렬 코드 열기
    int uart_open(int fd,const char *pathname)
    {
        assert(pathname);
    
        /*    */
        fd = open(pathname,O_RDWR|O_NOCTTY|O_NDELAY|O_NONBLOCK);
        if(fd == -1)
        {
            perror("Open UART failed!");
            return -1;
        }
    
        /*       ,              ,        0*/
        if(fcntl(fd,F_SETFL,0) < 0)
        {
            fprintf(stderr,"fcntl failed!
    "); return -1; } return fd; }

    직렬 코드 설정
    // 115200,0,8,'N',1
    int uart_set(int fd,int baude,int c_flow,int bits,char parity,int stop)
    {
        struct termios options;
    
        /*         */
        if(tcgetattr(fd,&options) < 0)
        {
            perror("tcgetattr error");
            return -1;
        }
    
    
        /*     */
        switch(baude)
        {
            case 4800:
                cfsetispeed(&options,B4800);
                cfsetospeed(&options,B4800);
                break;
            case 9600:
                cfsetispeed(&options,B9600);
                cfsetospeed(&options,B9600);
                break;
            case 19200:
                cfsetispeed(&options,B19200);
                cfsetospeed(&options,B19200);
                break;
            case 38400:
                cfsetispeed(&options,B38400);
                cfsetospeed(&options,B38400);
                break;
            case 115200:
                cfsetispeed(&options,B115200);
                cfsetospeed(&options,B115200);
                break;
            case 230400:
                cfsetispeed(&options,B230400);
                cfsetospeed(&options,B230400);
                break;
            default:
                fprintf(stderr,"Unkown baude!
    "); return -1; } /* */ options.c_cflag |= CLOCAL;// options.c_cflag |= CREAD;// /* */ switch(c_flow) { case 0:// options.c_cflag &= ~CRTSCTS; break; case 1:// options.c_cflag |= CRTSCTS; break; case 2:// options.c_cflag |= IXON|IXOFF|IXANY; break; default: fprintf(stderr,"Unkown c_flow!
    "); return -1; } /* */ switch(bits) { case 5: options.c_cflag &= ~CSIZE;// options.c_cflag |= CS5; break; case 6: options.c_cflag &= ~CSIZE;// options.c_cflag |= CS6; break; case 7: options.c_cflag &= ~CSIZE;// options.c_cflag |= CS7; break; case 8: options.c_cflag &= ~CSIZE;// options.c_cflag |= CS8; break; default: fprintf(stderr,"Unkown bits!
    "); return -1; } /* */ switch(parity) { /* */ case 'n': case 'N': options.c_cflag &= ~PARENB;//PARENB: , options.c_iflag &= ~INPCK;//INPCK: break; /* , 2 */ case 's': case 'S': options.c_cflag &= ~PARENB;//PARENB: , options.c_cflag &= ~CSTOPB;//CSTOPB: break; /* */ case 'o': case 'O': options.c_cflag |= PARENB;//PARENB: , options.c_cflag |= PARODD;//PARODD: , options.c_cflag |= INPCK;//INPCK: options.c_cflag |= ISTRIP;//ISTRIP: 7 , 8 break; /* */ case 'e': case 'E': options.c_cflag |= PARENB;//PARENB: , options.c_cflag &= ~PARODD;//PARODD: , options.c_cflag |= INPCK;//INPCK: options.c_cflag |= ISTRIP;//ISTRIP: 7 , 8 break; default: fprintf(stderr,"Unkown parity!
    "); return -1; } /* */ switch(stop) { case 1: options.c_cflag &= ~CSTOPB;//CSTOPB: break; case 2: options.c_cflag |= CSTOPB;//CSTOPB: break; default: fprintf(stderr,"Unkown stop!
    "); return -1; } /* */ options.c_oflag &= ~OPOST;//OPOST: , c_oflag /* */ options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* *ICANON: *ECHO: *ECHOE: EPASE Backspace,Space,Backspace *ISIG: */ /* */ options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 1;// /* , , */ tcflush(fd,TCIFLUSH); options.c_iflag = 0; options.c_oflag = 0; options.c_lflag = 0; /* */ if(tcsetattr(fd,TCSANOW,&options) < 0) { perror("tcsetattr failed"); return -1; } return 0; }

    크 랜 베 리 파이 수신 설정 완료 후 options.c 가 없 으 면iflag = 0; options.c_oflag = 0; options.c_lflag = 0;이 세 줄 의 코드 는 데이터 수신 이 불안정 할 수 있다.
    직렬 코드 닫 기
    int uart_close(int fd)
    {
        assert(fd);
        close(fd);
        
        return 0;
    }
    

    읽 기와 쓰기 직렬 포트
    linux 인터페이스 함수 read 와 write 함 수 를 사용 하면 직렬 읽 기와 쓰 기 를 실현 할 수 있다

    좋은 웹페이지 즐겨찾기