미친해커

[C] Serial Monitor Step 4 - 데이터 쓰기 본문

C/Serial Monitor

[C] Serial Monitor Step 4 - 데이터 쓰기

미친해커 2021. 12. 27. 02:58
반응형

데이터 쓰기까지 끝난다면 이제 확실하게 간단한 모듈을 만들 준비는 끝난다. 테스트를 위해 아두이노의 코드를 다음과 같이 변경했다.

void setup()
{
    Serial.begin(115200);
}

void loop()
{
    if (Serial.available())
    {
        char name[16] = { 0, };
        Serial.readBytesUntil(0x00, name, 16);

        char buffer[32] = { 0, };

        sprintf(buffer, "Hello %s!", name);

        Serial.println(buffer);
    }
}

시리얼 포트로부터 아두이노가 메시지를 받고 그 앞에 Hello를 붙여서 PC로 전송해주는 코드이다. 이렇게 PC와 아두이노가 정상적으로 통신하는지를 확인할 수 있게된다. 이제 Windows에서 데이터를 전송하고 받는 코드를 작성해보자

#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);

    while (TRUE)
    {
        char buffer[32] = { 0, };
        printf("PC : ");
        scanf("%s", buffer);
        if (WriteFile(hComm, buffer, strlen(buffer), NULL, NULL) == FALSE)
            continue;
        DWORD NumberOfBytesRead;
        while (TRUE)
        {
            ReadFile(hComm, buffer, 32, &NumberOfBytesRead, NULL);
            if (NumberOfBytesRead != 0)
            {
                printf("%s", buffer);
                break;
            }
        }
    }
    
    CloseHandle(hComm);
}

위 코드는 PC에서 입력을 받아 아두이노로 보내고 아두이노에서 데이터를 출력해주고 다시 입력을 받는 과정을 반복한다. 위 코드들을 이용해 서로 통신하면 다음과 같은 장면을 볼수 있다.

실제 동작 장면

위 이미지 처럼 아두이노와 PC가 시리얼 포트를 이용해 통신하는 장면을 볼수 있다. 이렇게 시리얼 포트를 이용해 데이터 쓰기까지 끝 마쳤다. 여기까지 배운 함수들과 방법을 이용해 간단한 모듈을 만들어 나만의 시리얼 모니터를 만들어봐야겠다.

반응형
Comments