미친해커

[C] Serial Monitor Step 2 - Baud Rate 설정 본문

C/Serial Monitor

[C] Serial Monitor Step 2 - Baud Rate 설정

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

저번에는 통신수단 Handle을 얻는 방법을 알게되었다. 시리얼 포트로 통신하는 거라면 Baud Rate를 설정해줘야 한다. 왜냐하면 통신하는 아두이노의 Baud Rate와 PC의 Baud Rate가 일치하지 않으면 제대로 통신이 이루어지지 않는다. 이번에도 열심히 구글 검색을 한 결과 2가지 함수를 알게 되었다. 그리고 이 글을 쓰는 지금 여자친구와 헤어졌습니다. 

 

Baud Rate를 설정하기 위해서는 DCB 구조체를 사용해야한다. MSDN에서는 이 구조체를 다음과 같이 정의하고 있다.

 

DCB (winbase.h) - Win32 apps

Defines the control setting for a serial communications device.

docs.microsoft.com

직렬 통신 장치에 대한 제어 설정을 정의합니다.

라고 정의되어 있다. 시리얼 포트 디바이스(직렬 통신 장치)와 통신하기 위해 필요한 설정들을 위 구조체를 이용해 설정한다. 우리는 기본적으로 설정되어 있는 값들을 가져온 다음 Baud Rate만 설정할 수 있으면 된다. 그러기 위해 사용하는 함수는 다음과 같다.

 

GetCommState function (winbase.h) - Win32 apps

Retrieves the current control settings for a specified communications device.

docs.microsoft.com

 

SetCommState function (winbase.h) - Win32 apps

Configures a communications device according to the specifications in a device-control block (a DCB structure). The function reinitializes all hardware and control settings, but it does not empty output or input queues.

docs.microsoft.com

#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_VALUE)
    {
        printf("CreateFileA Failed\n");
        printf("GetLastError : %d\n", GetLastError());
        return -1;
    }
    
    DCB state = { 0, };
    
    GetCommState(hComm, &state);
    
    state.BaudRate = 115200;
    
    SetCommState(hComm, &state);
    
    CloseHandle(hComm);
}

CreateFile 함수를 이용해 시리얼 포트 디바이스에대한 Handle을 얻었다면 GetCommState 함수를 이용해 현재 시리얼 포트 디바이스에대한 기본적은 설정들을 가져온다. 그후 Baud Rate를 원하는 값으로 설정한다. 그리고 SetCommState 함수를 이용해 변경된 설정을 적용해주면 Baud Rate가 변경된다.

 

이렇게 Baud Rate 설정까지 알았으니 이제 데이터를 읽고 쓰는 방법만 알게된다면 간단한 모듈을 만들 준비는 끝난다.

반응형
Comments