|
XP에서 RS-232 통신 Error 를 수정하다가.. 문제가 있어서 질문드립니다.
전에는 CreateThread로 핸들을 얻어서 사용했었는데요.. Win98에서는 잘 돌아가는데..
XP에서 Thread를 CreateThread로 열면 WriteFile에서 죽어버리더군요..
그래서 다음과 같이 다시 코딩을 해봤습니다.. 그랬더니.. Thread안에 있는 ReadFile에서 다운이 되어버립니다.
답변 부탁드리겠습니다. 소스 아래 넣을께요..
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "test_1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DCB DCBData;
HANDLE hComPort;
COMMTIMEOUTS CommTimeout;
DWORD id;
void DCB_Clear(void);
DWORD ReadThread (LPDWORD lpdwParam1);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DCB_Clear();
hComPort = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hComPort == INVALID_HANDLE_VALUE)
{
ShowMessage("Port의 핸들을 가져오는데 실패했습니다.");
return;
}
if(SetupComm(hComPort, 4096, 4096) == false)
{
CloseHandle(hComPort);
ShowMessage("포트 Buffer 설정에서 오류가 발생했습니다.");
return;
}
if(PurgeComm(hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) == FALSE)
{
CloseHandle(hComPort);
ShowMessage("Purge과정중 오류가 발생했습니다");
return;
}
CommTimeout.ReadIntervalTimeout = 15;
CommTimeout.ReadTotalTimeoutMultiplier = 0;
CommTimeout.ReadTotalTimeoutConstant = 0;
CommTimeout.WriteTotalTimeoutMultiplier = 0;
CommTimeout.WriteTotalTimeoutConstant = 0;
if(SetCommTimeouts(hComPort, &CommTimeout) == FALSE)
{
CloseHandle(hComPort);
ShowMessage("Timeout 설정중에 오류가 발생했습니다.");
return;
}
DCBData.BaudRate = CBR_9600;
DCBData.ByteSize = 8;
DCBData.Parity = NOPARITY;
DCBData.StopBits = ONESTOPBIT;
if(SetCommState(hComPort, &DCBData) < 0)
{
CloseHandle(hComPort);
ShowMessage("SetCommState Error");
return;
}
RXThread *T;
T = new RXThread(); // 쓰레드 생성
}
//---------------------------------------------------------------------------
void DCB_Clear(void)
{
DCBData.DCBlength = sizeof(DCB);
DCBData.BaudRate = CBR_9600;
DCBData.fBinary = FALSE;
DCBData.fParity = FALSE;
DCBData.fOutxCtsFlow = FALSE;
DCBData.fOutxDsrFlow = FALSE;
DCBData.fDtrControl = DTR_CONTROL_DISABLE;
DCBData.fDsrSensitivity = FALSE;
DCBData.fTXContinueOnXoff = FALSE;
DCBData.fOutX = FALSE;
DCBData.fInX = FALSE;
DCBData.fErrorChar = FALSE;
DCBData.fNull = FALSE;
DCBData.fRtsControl = RTS_CONTROL_DISABLE;
DCBData.fAbortOnError = FALSE;
DCBData.fDummy2 = NULL;
DCBData.XonLim = 0;
DCBData.XoffLim = 0;
DCBData.ByteSize = 8;
DCBData.Parity = NOPARITY;
DCBData.StopBits = ONESTOPBIT;
DCBData.XonChar = NULL;
DCBData.XoffChar = NULL;
DCBData.ErrorChar = NULL;
DCBData.EofChar = NULL;
DCBData.EvtChar = NULL;
DCBData.wReserved1 = 0;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
PurgeComm(hComPort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
if(CloseHandle(hComPort) == false)
ShowMessage("COM1 Port 핸들을 닫는과정에서 오류가 발생했습니다.");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
LONG lrc;
unsigned char TXBUF[1024] = {0};
TXBUF[0] = 0xC0; // Test용 packet
TXBUF[11] = 0xC0;
if (!WriteFile(hComPort, TXBUF, 12, (LPDWORD)&lrc, NULL))
{
ShowMessage("WriteFile중 오류가 발생했습니다.");
CloseHandle (hComPort);
}
}
//---------------------------------------------------------------------------
__fastcall RXThread::RXThread(void) : TThread(true)
{
FreeOnTerminate = true;
Resume();
}
void __fastcall RXThread::Execute(void)
{
while(!Terminated)
{
Synchronize(UpdateThread);
}
}
void __fastcall RXThread::UpdateThread(void)
{
unsigned char inbuff[1024];
DWORD nBytesRead;
if(!ReadFile(hComPort, inbuff, 1024, &nBytesRead, NULL)) // 여기서 다운.....
{
ShowMessage("ReadFile Error");
}
else
{
if(nBytesRead)
{
ShowMessage(IntToStr(nBytesRead) + "가 읽혔습니다.");
}
}
}
|