미친해커

[C] Serial Monitor Step 1 - 통신수단을 알아보자 본문

C/Serial Monitor

[C] Serial Monitor Step 1 - 통신수단을 알아보자

미친해커 2021. 12. 26. 19:22
반응형
 

GitHub - jungjin0003/Serial-Monitor

Contribute to jungjin0003/Serial-Monitor development by creating an account on GitHub.

github.com

해당 모듈은 위 깃헙에 커밋할 예정이다.

 

우선 아두이노는 시리얼 포트를 사용한다. 다른말로 COM 포트라고도 하는거 같다. 또 COM 포트는 각각 번호가 부여되어 있어서 COM1 ~ COM255까지 unsigned char의 범위 값 만큼 생성가능 한 것으로 보인다. (아마 USB랑 비슷한 취급인 것 같다) 먼저 아두이노를 컴퓨터에 연결하고 장치 관리자를 실행해준다.

장치 관리자

많은 탭 중에 포트(COM & LPT) 탭을 열게되면 위와 같이 연결되어 통신할 수 있는 시리얼 포트들이 보이는데 USB-SERIAL CH340(COM3)이 나의 아두이노 시리얼 포트 번호이다. (COM3이니 번호는 3이다) 나는 아두이노 우노를 사용하는데 정품이 아니라 호환보드를 구매했기 때문에 CH340이라 표시되는것 같다. 우선 시리얼 포트가 몇 번인지는 확인했다.

그런데 어떻게 통신할 수 있을까?

 

인터넷을 검색해보니 다음과 같이 예제가 있었다.

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    HANDLE hComm = CreateFileA("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    if (hComm == INVALID_HANDLE_VALUD)
    {
        printf("CreateFileA Failed\n");
        printf("GetLastError : %d\n", GetLastError());
        return -1;
    }
    
    CloseHandle(hComm);
}

CreateFile 함수를 사용해 Handle을 가져오는거 보니 하나의 Windows Kernel Object로 보인다. 그래서 WinObj로 해당 오브젝트를 확인해보았다.

WinObj로 해당 COM포트 확인

WinObj로 해당 오브젝트를 확인해보니 '\Device\Serial + number' 로 심볼릭 링크가 Global 하게 걸려있었다. 즉 '\\.\COM3' 는 '\Device\Serial2' 와 같은 오브젝트라는 것이다.

 

이렇게 시리얼 포트와 통신할 수 있는 수단을 C언어로 얻어내는 방법을 알게되었다.

반응형
Comments