Unity Serial 통신 메모

OWLS·2021년 7월 29일

아두이노 조이스틱으로 유니티에서 조작할 일이 생겼다. 아두이노 코딩 부분이 아니라 유니티에서 설정이나 고생을 많이했고 이를 글로 남겨보고자 한다. 깊게 파는게 아니라 기능을 동작하기 위한 방법을 설명하기 때문에 원리에 대한 것은 다른 분의 글을 참고하는걸 추천한다.

  1. project setting 변경
    Edit - project setting - (좌측) Player - Configuration - Api compatibility Level 을 .NET 4.x로 바꾼다.

이 부분을 설정하지 않으면 serial 통신을 위해 사용할 몇몇 모듈들이 정상 동작하지 않는다.

  1. 스크립트에서 아래 모듈을 삽입
using System.IO.Ports;
  1. 시리얼 통신을 담당할 변수 선언
    SerialPort sp;

  2. Void Start()
    4.1. 시리얼 통신을 열기 위한 정보 제공.
    sp = new SerialPort("COM3", 9600);
    왼쪽은 포트 이름, 오른쪽은 보드레이트이다. 둘다 일치하지 않으면 원활한 통신이 되지 않으므로 확인하고 정확히 기입할 것
    4.2. 명시적으로 통신 시작
    sp.Open();
    4.3 ReadTimeout 설정

        sp.ReadTimeout = 100; 

    원래 이런거 하지 않았는데 readline에서 timeout이 발생하며 무한 루프 걸리는 현상이 지속되었음. 이 부분에서 이 글을 포스팅하게 됨.
    ㅇㅇ

  3. Void update()
    5.1. sp.IsOpen
    이걸로 sp가 open을 했는지 안했는지를 확인 가능함. 함수가 아니라 bool타입 변수임.
    5.2. Read, write
    read는 아두이노에서 유니티로 읽어 오는 것.
    write는 유니티에서 아두이노에 보내는것.
    유니티 입장에서 생각하면 헷갈리지 않는다.

    read함수
    sp.Read(buffer, offset, maxSize) return type : int
    sp.ReadLine(); 아두이노에서 개행문자가 나올때까지 읽는다. 없다면 나올때까지 읽는다.
    sp.ReadExisting(); 아두이노가 컴퓨터로 보낸 문자들을 전부 받는다.

    개인적으로 readLine이 사용하기 가장 무난하다고 생각됨. 반환타입도 string이라서 처리하는데 별도로 복잡함도 없음.

    write함수
    sp.Write(context); context대한 내용을 아두이노로 보낸다.

  4. 조이스틱 동작 지연.
    몇번 하다보면 조이스틱 반응이 대단히 느린 경우가 있다. 이는 업데이트 과정에서 아두이노가 데이터로 보낸 정보들이 여전히 통신 버퍼에 남아있기 때문에 이를 순차적으로 처리하는 과정에서 지연된다고 본다. (정확한 원리는 잘 모른다)
    따라서 해결 하는 방법으로는 readExisting과 같이 통신 내용을 한번에 읽고 비우는 함수를 사용하거나 매 update 마다 아두이노에서 값을 읽어들인다.

얼추 이정도면 유니티에서 아두이노를 통한 시리얼 통신할때 주의해야될 점을 적은 것 같다. 이번 프로젝트에서 시리얼 통신을 처음 접했고 그 과정에서 깊게 이해를 하지는 못했지만 그래도 어떻게 사용 자체를 할 수 있게 여러 주의사항들을 알게 된듯하고 이에 따라 그 점들을 적어보았다.

profile
코딩에 관심 많은 사람

0개의 댓글