스스로 해결해 보려 했으나... 전공이랑 관련이 없다보니 인터넷 뒤지는게 전부라 열심히 뒤져봤지만 해결하지 못하여 이렇게 질문 드립니다. <div><br></div> <div>목적은 단순합니다</div> <div>VS2010 C++ 콘솔 기반으로 시리얼 통신 하는게 전부인데</div> <div><br></div> <div>현재 인터넷에서 소스를 구하여 송신 까지는 가능한 상황입니다.</div> <div><br></div> <div>그런데 이 소스를 작성하신 분께서 ReadByte 함수를 사용하면 수신도 가능하다고 하시는데...</div> <div>송신과 수신은 아무래도 다르다보니 제가 사용법을 모르겠어서 질문드립니다.</div> <div>(AVR로 232통신 할때는 인터럽트 같은걸 사용했는데 VS2010 에서는 모르겠네요)</div> <div><br></div> <div>출처 : <a target="_blank" href="http://blog.naver.com/onlywin7788/140161634165">http://blog.naver.com/onlywin7788/140161634165</a></div> <div><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong>1. SerialPort.h</strong></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <table class="__se_tbl" border="0" cellspacing="0" cellpadding="0" style="color:#000000;font-family:'돋움';font-size:12px;line-height:18px;border-width:1px 1px 0px 0px;width:468px;height:560px;border-top-color:#cccccc;border-top-style:solid;border-right-color:#cccccc;border-right-style:solid;"><tbody><tr><td width="677" style="border-bottom-color:#cccccc;border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-color:#cccccc;border-left-style:solid;"> <p style="margin:0px;padding:0px;line-height:1.5;"> #include <Windows.h><br>#include <atlstr.h></p> <p style="margin:0px;padding:0px;line-height:1.5;">#define BUFFER_SIZE 128</p> <p style="margin:0px;padding:0px;line-height:1.5;">class CSerialPort <br>{ <br>public: <br> CSerialPort(void); <br> virtual ~CSerialPort(void); </p> <p style="margin:0px;padding:0px;line-height:1.5;">private: <br> HANDLE m_hComm; <br> DCB m_dcb; <br> COMMTIMEOUTS m_CommTimeouts; <br> bool m_bPortReady; <br> bool m_bWriteRC; <br> bool m_bReadRC; <br> DWORD m_iBytesWritten; <br> DWORD m_iBytesRead; <br> DWORD m_dwBytesRead; </p> <p style="margin:0px;padding:0px;line-height:1.5;">public: <br> void ClosePort(); <br> bool ReadByte(BYTE &resp); <br> bool ReadByte(BYTE* &resp, UINT size); <br> bool WriteByte(BYTE bybyte); <br> bool OpenPort(CString portname); <br> bool SetCommunicationTimeouts(DWORD ReadIntervalTimeout, <br> DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, <br> DWORD WriteTotalTimeoutMultiplier,DWORD WriteTotalTimeoutConstant); <br> bool ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, <br> BYTE Parity,BYTE StopBits); <br>};<br></p></td></tr></tbody></table><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong>2. SerialPort.cpp</strong></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <table class="__se_tbl" border="0" cellspacing="0" cellpadding="0" style="color:#000000;font-family:'돋움';font-size:12px;line-height:18px;border-width:1px 1px 0px 0px;width:582px;height:2180px;border-top-color:#cccccc;border-top-style:solid;border-right-color:#cccccc;border-right-style:solid;"><tbody><tr><td width="677" style="border-bottom-color:#cccccc;border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-color:#cccccc;border-left-style:solid;"> <p style="margin:0px;padding:0px;line-height:1.5;"> #include "serialport.h"<br>CSerialPort::CSerialPort() <br>{ <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">CSerialPort::~CSerialPort() <br>{ <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::OpenPort(CString portname) <br>{ <br> m_hComm = CreateFile(L"//./" + portname, <br> GENERIC_READ | GENERIC_WRITE, <br> 0, <br> 0, <br> OPEN_EXISTING, <br> 0, <br> 0); <br> if(m_hComm == INVALID_HANDLE_VALUE) <br> { <br> return false; <br> } <br> else <br> return true; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, <br> BYTE Parity, BYTE StopBits) <br>{ <br> if((m_bPortReady = GetCommState(m_hComm, &m_dcb))==0) <br> { <br> printf("\nGetCommState Error\n");<br> //"MessageBox(L, L"Error", MB_OK + MB_ICONERROR); <br> CloseHandle(m_hComm); <br> return false; <br> } </p> <p style="margin:0px;padding:0px;line-height:1.5;"> m_dcb.BaudRate = BaudRate; <br> m_dcb.ByteSize = ByteSize; <br> m_dcb.Parity = Parity ; <br> m_dcb.StopBits = StopBits; <br> m_dcb.fBinary = true; <br> m_dcb.fDsrSensitivity = false; <br> m_dcb.fParity = fParity; <br> m_dcb.fOutX = false; <br> m_dcb.fInX = false; <br> m_dcb.fNull = false; <br> m_dcb.fAbortOnError = true; <br> m_dcb.fOutxCtsFlow = false; <br> m_dcb.fOutxDsrFlow = false; <br> m_dcb.fDtrControl = DTR_CONTROL_DISABLE; <br> m_dcb.fDsrSensitivity = false; <br> m_dcb.fRtsControl = RTS_CONTROL_DISABLE; <br> m_dcb.fOutxCtsFlow = false; <br> m_dcb.fOutxCtsFlow = false; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> m_bPortReady = SetCommState(m_hComm, &m_dcb); </p> <p style="margin:0px;padding:0px;line-height:1.5;"> if(m_bPortReady == 0) <br> { <br> //MessageBox(L"SetCommState Error"); <br> printf("SetCommState Error");<br> CloseHandle(m_hComm); <br> return false; <br> } </p> <p style="margin:0px;padding:0px;line-height:1.5;"> return true; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, <br> DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, <br> DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant) <br>{ <br> if((m_bPortReady = GetCommTimeouts(m_hComm, &m_CommTimeouts)) == 0) <br> return false; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout; <br> m_CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant; <br> m_CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier; <br> m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; <br> m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> m_bPortReady = SetCommTimeouts(m_hComm, &m_CommTimeouts); </p> <p style="margin:0px;padding:0px;line-height:1.5;"> if(m_bPortReady == 0) <br> { <br> //MessageBox(L"StCommTimeouts function failed",L"Com Port Error",MB_OK+MB_ICONERROR); <br> printf("\nStCommTimeouts function failed\n");<br> CloseHandle(m_hComm); <br> return false; <br> } </p> <p style="margin:0px;padding:0px;line-height:1.5;"> return true; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::WriteByte(BYTE bybyte) <br>{ <br> //iBytesWritten=0;<br> //m_iBytesWritten=0; <br> if(WriteFile(m_hComm, &bybyte, 1, &m_iBytesWritten, NULL) == 0) <br> return false; <br> else <br> return true; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::ReadByte(BYTE &resp) <br>{ <br> BYTE rx; <br> resp=0; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> DWORD dwBytesTransferred=0; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> if(ReadFile(m_hComm, &rx, 1, &dwBytesTransferred, 0)) <br> { <br> if(dwBytesTransferred == 1) <br> { <br> resp=rx; <br> return true; <br> } <br> } </p> <p style="margin:0px;padding:0px;line-height:1.5;"> return false; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">bool CSerialPort::ReadByte(BYTE* &resp, UINT size) <br>{ <br> DWORD dwBytesTransferred=0; </p> <p style="margin:0px;padding:0px;line-height:1.5;"> if(ReadFile(m_hComm, resp, size, &dwBytesTransferred, 0)) <br> { <br> if(dwBytesTransferred == size) <br> return true; <br> } </p> <p style="margin:0px;padding:0px;line-height:1.5;"> return false; <br>} </p> <p style="margin:0px;padding:0px;line-height:1.5;">void CSerialPort::ClosePort() <br>{ <br> CloseHandle(m_hComm); <br> return; <br>} </p></td></tr></tbody></table><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;">다음은 단순히 위의 클래스를 Warpping 한 클래스이다.</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong>3. SerialComm.h</strong></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong></strong> </p> <table class="__se_tbl" border="0" cellspacing="0" cellpadding="0" style="color:#000000;font-family:'돋움';font-size:12px;line-height:18px;border-width:1px 1px 0px 0px;width:332px;height:254px;border-top-color:#cccccc;border-top-style:solid;border-right-color:#cccccc;border-right-style:solid;"><tbody><tr><td width="677" style="border-bottom-color:#cccccc;border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-color:#cccccc;border-left-style:solid;"> <p style="margin:0px;padding:0px;line-height:1.5;"> #include "serialport.h"</p> <p style="margin:0px;padding:0px;line-height:1.5;">#define RETURN_SUCCESS 1<br>#define RETURN_FAIL 0</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br>class CSerialComm<br>{<br>public :<br> CSerialComm();<br> ~CSerialComm();</p> <p style="margin:0px;padding:0px;line-height:1.5;"> CSerialPort serial;<br> int connect(char* _portNum);<br> int sendCommand(unsigned char pos);<br> void disconnect();<br>};</p></td></tr></tbody></table><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong>4. SerialComm.cpp</strong></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> 각종 설정 정보를 그냥 클래스에 박았는데, (친구가 그냥 안 바뀐다고 박아달라더라...)</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;">취향에 맞게 Setter, Getter 로 빼도록 하자.</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong></strong> </p> <table class="__se_tbl" border="0" cellspacing="0" cellpadding="0" style="color:#000000;font-family:'돋움';font-size:12px;line-height:18px;border-width:1px 1px 0px 0px;width:449px;height:452px;border-top-color:#cccccc;border-top-style:solid;border-right-color:#cccccc;border-right-style:solid;"><tbody><tr><td width="677" style="border-bottom-color:#cccccc;border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-color:#cccccc;border-left-style:solid;"> <p style="margin:0px;padding:0px;line-height:1.5;"> #include "serialcomm.h"</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br>CSerialComm::CSerialComm(){}<br>CSerialComm::~CSerialComm(){}</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br>int CSerialComm::connect(char* portNum)<br>{<br> if(!serial.OpenPort("COM4"))<br> return RETURN_FAIL;</p> <p style="margin:0px;padding:0px;line-height:1.5;"> serial.ConfigurePort(CBR_115200, 8, FALSE, NOPARITY, ONESTOPBIT); <br> serial.SetCommunicationTimeouts(0, 0, 0, 0, 0);</p> <p style="margin:0px;padding:0px;line-height:1.5;"> return RETURN_SUCCESS;<br>}</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br>int CSerialComm::sendCommand(unsigned char pos)<br>{<br> if(serial.WriteByte(pos))<br> return RETURN_SUCCESS;<br> else<br> return RETURN_FAIL;<br>}</p> <p style="margin:0px;padding:0px;line-height:1.5;">void CSerialComm::disconnect()<br>{<br> serial.ClosePort();<br>}</p></td></tr></tbody></table><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;">실제 구동하는 main 부...</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong></strong> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><strong>5. main. cpp</strong></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <table class="__se_tbl" border="0" cellspacing="0" cellpadding="0" style="color:#000000;font-family:'돋움';font-size:12px;line-height:18px;border-width:1px 1px 0px 0px;width:288px;height:524px;border-top-color:#cccccc;border-top-style:solid;border-right-color:#cccccc;border-right-style:solid;"><tbody><tr><td width="677" style="border-bottom-color:#cccccc;border-width:0px 0px 1px 1px;border-bottom-style:solid;border-left-color:#cccccc;border-left-style:solid;"> <p style="margin:0px;padding:0px;line-height:1.5;"> #include <stdio.h><br>#include "serialcomm.h"</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br>int main()<br>{<br> CSerialComm serialComm;</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br> // STEP 1. SerialPort Connect<br> if(!serialComm.connect("COM4"))<br> {<br> printf("connect faliled");<br> return -1;<br> }<br> else<br> printf("connect successed\n");</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br> // STEP 2. Send Command<br> if(!serialComm.sendCommand('A'))<br> { <br> printf("send command failed\n");<br> }<br> else<br> printf("send Command success\n");</p> <p style="margin:0px;padding:0px;line-height:1.5;"><br> // STEP 3. SerialPort disConnect<br> serialComm.disconnect();</p> <p style="margin:0px;padding:0px;line-height:1.5;"> printf("\nend connect\n");<br> return 0;</p> <p style="margin:0px;padding:0px;line-height:1.5;">}</p></td></tr></tbody></table><p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"> </p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><br></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;">main 부 조금만 건들면 될꺼 같은데... 이 소스를 이용하여 데이터 수신을 하려면 어떻게 수정해야 할지 알려주시면 정말 감사하겠습니다.</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><br></p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;">위 메인 구문 그대로 이용하면 현재 송신 까진 가능한 상태 입니다.</p> <p style="margin:0px;padding:0px;font-family:'돋움';text-align:justify;"><br></p> <p></p></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.