본문 바로가기
코스웨어/15년 스마트컨트롤러

20151207 / 리눅스 시리얼 통신_남수진

by 알 수 없는 사용자 2015. 12. 8.
728x90
반응형

리눅스 시리얼 통신

  • 리눅스 환경에서 시리얼 통신하기 위해서
    • /dev/ttyS~ 라는 이름의 장치를 저수준 함수로 제어
    • 실제 장치가 없으면 컴퓨터에 가상 포트를 설치하면 된다
  • struct termios
    • 시리얼 포트의 입출력을 설정하는 구조체
      • 소켓 네트워크에서 네트워크 정보를 설정하던 방식과 비슷하게 사용됨
    • POSIX가 지정한 표준 인터페이스
      • 운영체제 표준안을 만족한다
    • 구조체 항목
      • c_iflag: 터미널 입력에 대해 설정
      • c_oflag: 터미널 출력에 대해 설정
      • c_cflag: 터미널 제어에 대해 설정(데이터 비트, 패리티 등)
      • c_lflag
      • c_cc
  • 시리얼 통신 프로그래밍 기법
    • canonical
      • 한 줄 단위(엔터 단위)로 통신
        • 도스창같이 엔터를 입력할 때까지 통신하지 않음
        • NL(LF), EOF, EOL로 줄을 구분
    • non-canonical
      • 고정된 크기의 데이터만 읽어들임
    • asynchronous
      • non-canonical에서 추가 조건이 들어감
    • multi flexing
      • select()를 사용하는 방식

  • 윈도우에 가상 시리얼 포트를 만들어 가상 머신/하이퍼터미널과 연결해 PC 내부에서 시리얼 통신할 수 있도록 설정

  • 컴퓨터에 가상 serial 포트 추가(Eltima)
    • serial 통신 중간에서 데이터를 중개하여 데이터를 알아내 통신 프로토콜을 분석할 때 활용 가능
    • VMware를 껐다 켜야 가상 포트가 VMWare에 인식된다

  • VMWare에 serial port 추가
    • 전원을 완전히 off시킨 후에 VM->setting에 들어가서 아래와 같이 serial port 추가



  • 시리얼 통신 방식
    • canonical: 엔터입력 대기
    • non-canonical: 시간/개수제한
    • asynchronous: SW 인터럽트
    • multi flexing: select() 사용
  • O_NOCTTY
    • 프로그램 제어 신호를 제어신호로 인식하도록
    • Ctrl+C 제어문자를 전송 문자로 인식하여서 프로그램 종료 기능이 먹지 않는 경우를 방지
  • tcgetattr(터미널 장치 번호, 데이터를 저장할 구조체)
    • 터미널의 속성을 가져온다

  • canonical uart
    • 엔터 입력이 들어오면 데이터 수신 종료

    • 실행 결과


  • non-canonical uart
    • 정해진 길이의 글자가 들어오면 수신 종료

    • 실행 결과


  • asynchronous
    • sigaction(SIGIO, 핸들러, NULL)
      • 입출력이 발생하면 실행할 핸들러 함수 설정
    • fcntl
      • open으로 연 fd의 특성을 바꾸기 위한 함수
    • canonical 방식을 SW인터럽트와 함께 사용하는 방식
      1. 입출력이 발생하면 SIGIO 신호 발생
      2. SIGIO에 의해 핸들러 함수 Handle_Serial_Sig 호출됨
      3. iBreak=1이 되면서 while문 안의 read 함수 실행 -> 시리얼 통신으로 문자 읽기

    • 실행 결과



  • multi flexing
    • select() 함수를 사용한 시리얼 통신

    • 실행 결과


728x90