2005년 08월 16일
시리얼 통신 프로그램
동아리에서 썼던 프로그램 소스를 줄여서 간단하게 만들었다.
에러처리까지 다 지웠다.. -_-;;
그리고 잘 모르는 부분을 그냥 남겨뒀다..
키보드 입력을 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);
}
에러처리까지 다 지웠다.. -_-;;
그리고 잘 모르는 부분을 그냥 남겨뒀다..
키보드 입력을 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 | 2005/08/16 01:55 | 작업물 | 트랙백 | 덧글(3)



☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]