시리얼 통신 프로그램

동아리에서 썼던 프로그램 소스를 줄여서 간단하게 만들었다.
에러처리까지 다 지웠다.. -_-;;
그리고 잘 모르는 부분을 그냥 남겨뒀다..

키보드 입력을 COM1 포트로 보내고
COM1포트에서 오는 신호를 화면에 뿌린다.



#include <cstdio>
#include <conio.h>
using namespace std;

#include <windows.h>

OVERLAPPED ovRead;
OVERLAPPED ovWrite;

void thread(HANDLE hCom)
{
    OVERLAPPED ov;
    ZeroMemory(&ov, sizeof ov);
    ov.hEvent = CreateEvent(0, TRUE, FALSE, 0);
    SetCommMask(hCom, EV_RXCHAR);

    while(1)
    {
        DWORD event = 0;
        WaitCommEvent(hCom, &event, 0);

        if ((event & EV_RXCHAR) == EV_RXCHAR)
        {
            DWORD read;
            int c;
            while (ReadFile(hCom, &c, 1, &read, &ovRead) && read)
            {
                putch(c);
            }
        }
        Sleep(10);

    }
    CloseHandle(ov.hEvent);
}

int main(int argc, char* argv[])
{
    ovWrite.Offset = 0;
    ovWrite.OffsetHigh = 0;
    ovWrite.hEvent = CreateEvent(0, 1, 0, 0);

    ovRead.Offset = 0;
    ovRead.OffsetHigh = 0;
    ovRead.hEvent = CreateEvent(0, 1, 0, 0);

    HANDLE hCom;
    hCom = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, 0);

    SetCommMask(hCom, EV_RXCHAR);
    SetupComm(hCom, 4096, 4096);
    PurgeComm(hCom, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);

    COMMTIMEOUTS timeouts;
    timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.WriteTotalTimeoutMultiplier = 1;
    timeouts.WriteTotalTimeoutConstant = 0;
    SetCommTimeouts(hCom, &timeouts);

    DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    GetCommState(hCom, &dcb);    
    dcb.BaudRate = 19200;
    dcb.ByteSize = 8;
    dcb.Parity = 2;
    dcb.StopBits = 0;

    SetCommState(hCom, &dcb);

    DWORD threadID;
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)thread, (LPVOID)hCom, 0, &threadID);

    DWORD written;
    while (1)
    {
        int c = _getch();
        WriteFile(hCom, &c, 1, &written, &ovWrite);
    }

    SetCommMask(hCom, 0);
    PurgeComm(hCom, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
    CloseHandle(hCom);
}

by kiho | 2005/08/16 01:55 | 작업물 | 트랙백 | 덧글(3)

트랙백 주소 : http://kiho.egloos.com/tb/483420
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by mmojz at 2005/08/17 11:46
생소한 함수들이 많네;
Commented by 지나가던.. at 2005/08/25 10:21
퍼갑니다..
Commented by 영리한야옹이 at 2005/09/08 20:38
ㅋㅋ 그게 나도 모르고 여기 저기 짜맞춘거니..ㅋㅋㅋ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶