게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
(본삭금) vs2010 콘솔 기반 시리얼 통신 소스 질문 입니다.
게시물ID : programmer_4807짧은주소 복사하기
작성자 : 미드빅뱅이론
추천 : 1
조회수 : 6490회
댓글수 : 5개
등록시간 : 2014/08/02 17:45:56
옵션
  • 베스트금지
  • 본인삭제금지
스스로 해결해 보려 했으나... 전공이랑 관련이 없다보니 인터넷 뒤지는게 전부라 열심히 뒤져봤지만 해결하지 못하여 이렇게 질문 드립니다.

목적은 단순합니다
VS2010 C++ 콘솔 기반으로 시리얼 통신 하는게 전부인데

현재 인터넷에서 소스를 구하여 송신 까지는 가능한 상황입니다.

그런데 이 소스를 작성하신 분께서 ReadByte 함수를 사용하면 수신도 가능하다고 하시는데...
송신과 수신은 아무래도 다르다보니 제가 사용법을 모르겠어서 질문드립니다.
(AVR로 232통신 할때는 인터럽트 같은걸 사용했는데 VS2010 에서는 모르겠네요)

출처 : http://blog.naver.com/onlywin7788/140161634165

 

1. SerialPort.h

 

 #include <Windows.h>
#include <atlstr.h>

#define BUFFER_SIZE 128

class CSerialPort  
{  
public:  
 CSerialPort(void);  
 virtual ~CSerialPort(void); 

private:  
 HANDLE  m_hComm;  
 DCB     m_dcb;  
 COMMTIMEOUTS m_CommTimeouts;  
 bool    m_bPortReady;  
 bool    m_bWriteRC;  
 bool    m_bReadRC;  
 DWORD   m_iBytesWritten;  
 DWORD   m_iBytesRead;  
 DWORD   m_dwBytesRead; 

public:  
 void ClosePort();  
 bool ReadByte(BYTE &resp);  
 bool ReadByte(BYTE* &resp, UINT size);  
 bool WriteByte(BYTE bybyte);  
 bool OpenPort(CString portname);  
 bool SetCommunicationTimeouts(DWORD ReadIntervalTimeout,  
  DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant,  
  DWORD WriteTotalTimeoutMultiplier,DWORD WriteTotalTimeoutConstant);  
 bool ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity,   
  BYTE  Parity,BYTE StopBits);  
};

 

 

 

2. SerialPort.cpp

 

 #include "serialport.h"
CSerialPort::CSerialPort()  
{  

CSerialPort::~CSerialPort()  
{  

bool CSerialPort::OpenPort(CString portname)  
{  
 m_hComm = CreateFile(L"//./" + portname,  
  GENERIC_READ | GENERIC_WRITE,  
  0,  
  0,  
  OPEN_EXISTING,  
  0,  
  0);  
 if(m_hComm == INVALID_HANDLE_VALUE)  
 {  
  return false;  
 }  
 else  
  return true;  

bool CSerialPort::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity,   
 BYTE Parity, BYTE StopBits)  
{  
 if((m_bPortReady = GetCommState(m_hComm, &m_dcb))==0)  
 {  
  printf("\nGetCommState Error\n");
  //"MessageBox(L, L"Error", MB_OK + MB_ICONERROR);  
  CloseHandle(m_hComm);  
  return false;  
 } 

 m_dcb.BaudRate          = BaudRate;  
 m_dcb.ByteSize          = ByteSize;  
 m_dcb.Parity            = Parity ;  
 m_dcb.StopBits          = StopBits;  
 m_dcb.fBinary           = true;  
 m_dcb.fDsrSensitivity   = false;  
 m_dcb.fParity           = fParity;  
 m_dcb.fOutX             = false;  
 m_dcb.fInX              = false;  
 m_dcb.fNull             = false;  
 m_dcb.fAbortOnError     = true;  
 m_dcb.fOutxCtsFlow      = false;  
 m_dcb.fOutxDsrFlow      = false;  
 m_dcb.fDtrControl       = DTR_CONTROL_DISABLE;  
 m_dcb.fDsrSensitivity   = false;  
 m_dcb.fRtsControl       = RTS_CONTROL_DISABLE;  
 m_dcb.fOutxCtsFlow      = false;  
 m_dcb.fOutxCtsFlow      = false; 

 m_bPortReady = SetCommState(m_hComm, &m_dcb); 

 if(m_bPortReady == 0)  
 {  
  //MessageBox(L"SetCommState Error");  
  printf("SetCommState Error");
  CloseHandle(m_hComm);  
  return false;  
 } 

 return true;  

bool CSerialPort::SetCommunicationTimeouts(DWORD ReadIntervalTimeout,  
 DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant,  
 DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant)  
{  
 if((m_bPortReady = GetCommTimeouts(m_hComm, &m_CommTimeouts)) == 0)  
  return false; 

 m_CommTimeouts.ReadIntervalTimeout          = ReadIntervalTimeout;  
 m_CommTimeouts.ReadTotalTimeoutConstant     = ReadTotalTimeoutConstant;  
 m_CommTimeouts.ReadTotalTimeoutMultiplier   = ReadTotalTimeoutMultiplier;  
 m_CommTimeouts.WriteTotalTimeoutConstant    = WriteTotalTimeoutConstant;  
 m_CommTimeouts.WriteTotalTimeoutMultiplier  = WriteTotalTimeoutMultiplier; 

 m_bPortReady = SetCommTimeouts(m_hComm, &m_CommTimeouts); 

 if(m_bPortReady == 0)  
 {  
  //MessageBox(L"StCommTimeouts function failed",L"Com Port Error",MB_OK+MB_ICONERROR);  
  printf("\nStCommTimeouts function failed\n");
  CloseHandle(m_hComm);  
  return false;  
 } 

 return true;  

bool CSerialPort::WriteByte(BYTE bybyte)  
{  
 //iBytesWritten=0;
 //m_iBytesWritten=0;  
 if(WriteFile(m_hComm, &bybyte, 1, &m_iBytesWritten, NULL) == 0)  
  return false;  
 else  
  return true;  

bool CSerialPort::ReadByte(BYTE &resp)  
{  
 BYTE rx;  
 resp=0; 

 DWORD dwBytesTransferred=0; 

 if(ReadFile(m_hComm, &rx, 1, &dwBytesTransferred, 0))  
 {  
  if(dwBytesTransferred == 1)  
  {  
   resp=rx;  
   return true;  
  }  
 } 

 return false;  

bool CSerialPort::ReadByte(BYTE* &resp, UINT size)  
{  
 DWORD dwBytesTransferred=0; 

 if(ReadFile(m_hComm, resp, size, &dwBytesTransferred, 0))  
 {  
  if(dwBytesTransferred == size)  
   return true;  
 } 

 return false;  

void CSerialPort::ClosePort()  
{  
 CloseHandle(m_hComm);  
 return;  

 

 

 

다음은 단순히 위의 클래스를 Warpping 한 클래스이다.

 

3. SerialComm.h

 

 #include "serialport.h"

#define RETURN_SUCCESS 1
#define RETURN_FAIL 0


class CSerialComm
{
public :
 CSerialComm();
 ~CSerialComm();

 CSerialPort  serial;
 int    connect(char* _portNum);
 int    sendCommand(unsigned char pos);
 void   disconnect();
};

 

 

 

4. SerialComm.cpp

 

 각종 설정 정보를 그냥 클래스에 박았는데, (친구가 그냥 안 바뀐다고 박아달라더라...)

취향에 맞게 Setter, Getter 로 빼도록 하자.

 

 #include "serialcomm.h"


CSerialComm::CSerialComm(){}
CSerialComm::~CSerialComm(){}


int CSerialComm::connect(char* portNum)
{
 if(!serial.OpenPort("COM4"))
  return RETURN_FAIL;

 serial.ConfigurePort(CBR_115200, 8, FALSE, NOPARITY, ONESTOPBIT); 
 serial.SetCommunicationTimeouts(0, 0, 0, 0, 0);

 return RETURN_SUCCESS;
}


int CSerialComm::sendCommand(unsigned char pos)
{
 if(serial.WriteByte(pos))
  return RETURN_SUCCESS;
 else
  return RETURN_FAIL;
}

void CSerialComm::disconnect()
{
 serial.ClosePort();
}

 

 

 

실제 구동하는 main 부...

 

5. main. cpp

 

 #include <stdio.h>
#include "serialcomm.h"


int main()
{
 CSerialComm serialComm;


 // STEP 1. SerialPort Connect
 if(!serialComm.connect("COM4"))
 {
  printf("connect faliled");
  return -1;
 }
 else
  printf("connect successed\n");


 // STEP 2. Send Command
 if(!serialComm.sendCommand('A'))
 { 
  printf("send command failed\n");
 }
 else
  printf("send Command success\n");


 // STEP 3. SerialPort disConnect
 serialComm.disconnect();

 printf("\nend connect\n");
  return 0;

}

 


main 부 조금만 건들면 될꺼 같은데... 이 소스를 이용하여 데이터 수신을 하려면 어떻게 수정해야 할지 알려주시면 정말 감사하겠습니다.


위 메인 구문 그대로 이용하면 현재 송신 까진 가능한 상태 입니다.


전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호