미친해커

[C] Serial Monitor Step 4.5 - CommTimeouts 본문

C/Serial Monitor

[C] Serial Monitor Step 4.5 - CommTimeouts

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

사실 이 내용을 올려야 하나 말아야 하나 고민을 했지만 결국 번외로 올리기로 결정했다. 아마 지금까지 올린 코드만보고 컴파일 했을 때 정상적으로 출력되는 사람이 있는 한편 그렇지 않은 사람도 있을 것이다. 나는 이 블로그를 쓰기 전 처음에 미리 시도해봤을 때는 출력이 이상하게 되었다, 그래서 CommTimeouts이라는 것을 설정해줘야 한다는 글을 발견하였고 실제로 이것을 설정하니 오류가 해결되었다. 하지만 블로그를 쓰면서 다시 한번 테스트하니 해당 오류가 발생하지 않았다. 그래서 이건 간단하게 남기려고한다.

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

    COMMTIMEOUTS timeout = { 0 };
    timeout.ReadIntervalTimeout = 50;
    timeout.ReadTotalTimeoutConstant = 50;
    timeout.ReadTotalTimeoutMultiplier = 10;
    timeout.WriteTotalTimeoutConstant = 50;
    timeout.WriteTotalTimeoutMultiplier = 10;

    if (SetCommTimeouts(hComm, &timeout) == FALSE)
    {
        printf("SetCommTimeouts Failed\n");
        printf("GetLastError : %d\n", GetLastError());
        CloseHandle(hComm);
        return -1;
    }

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

 

 

COMMTIMEOUTS (winbase.h) - Win32 apps

Contains the time-out parameters for a communications device.

docs.microsoft.com

위 구조체를 사용해 Timeouts을 설정한건데 아직 각 멤버변수 별 어떠한 기능을 하는지는 잘 모르겠다. 하지만 대체로 위 코드와 같은 값을 설정해서 사용한다는 것을 발견하게 되었다. 자세한건 위 MSDN에서 확인하기 바란다.

반응형
Comments