[MFC] 시리얼 통신 프로그램

당근한박스·2023년 12월 18일
2

C++

목록 보기
12/23

시리얼 통신은 컴퓨터나 다른 장치 간에 데이터를 주고받기 위한 표준 통신 방법 중 하나로, 시리얼 통신에서 사용되는 몇 가지 중요한 매개변수는 다음과 같다.


1. COM 포트 (COM Port)
COM 포트는 "Communication Port"의 약자로, 컴퓨터나 다른 디바이스에 연결된 시리얼 포트를 나타낸다.
2. Baud Rate
Baud rate는 초당 비트 전송 속도를 나타내는 단위로, 시리얼 통신에서는 데이터를 주고받는 속도로 사용되며 일반적으로 9600, 19200, 38400, 115200 등이 흔히 사용된다.
3. Data Bits
데이터 비트는 한 번에 전송되는 비트 수를 나타낸다.
일반적으로 7 또는 8 비트가 사용되며 데이터 비트의 수는 전송되는 데이터의 크기를 결정한다.
4. Parity
패리티 비트는 에러 검출을 위한 비트로, 전송된 데이터에 대한 에러를 확인하는 데 사용된다.
주로 홀수 패리티(Odd Parity), 짝수 패리티(Even Parity), 또는 패리티 비트를 사용하지 않는 No Parity로 설정할 수 있다.
5. Stop Bits
스톱 비트는 한 문자의 전송이 끝났음을 나타내는 데 사용됩니다.
일반적으로 1 또는 2 스톱 비트를 사용하며, 1 스톱 비트가 가장 흔하게 사용된다.


이러한 매개변수들은 시리얼 통신을 설정할 때 중요하며 송수신하는 장치 간에 일관된 설정이 필요하다. (설정이 일치하지 않으면 데이터가 정확하게 전송되지 않을 수 있음)



VSPE 가상 PORT 실행


ASCII와 HEX로 전송

void CSerialCommunicationDlg::OnBnClickedSend()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString str;
	GetDlgItem(IDC_EDIT_SEND)->GetWindowTextA(str); // 컨트롤에서 텍스트 가져오기

	if (IsDlgButtonChecked(IDC_RADIO_ASCII)) // IDC_RADIO_ASCII가 선택되어 있을 때
	{
		CString str;
		GetDlgItem(IDC_EDIT_SEND)->GetWindowTextA(str); //컨트롤에서 텍스트 가져오기
		//str += "\r\n";
        
		//m_comm이라는 시리얼 통신 객체의 Send 함수를 호출하여 준비된 데이터 전송
		m_comm->Send(str, str.GetLength());
		str += _T("\r\n");
		int insertPos = m_edit_rcv_view.LineIndex(0);
		SYSTEMTIME time;
		GetLocalTime(&time);
		CString currentDate;
		
		currentDate.Format("S [%02d:%02d:%02d'%03ld]", time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
		
		m_edit_rcv_view.SetSel(insertPos, insertPos);
		m_edit_rcv_view.ReplaceSel(currentDate + _T(" : ") + str);
		m_edit_rcv_view.SetSel(0, 0);
		
	}
	else if (IsDlgButtonChecked(IDC_RADIO_HEX)) // IDC_RADIO_HEX가 선택되어 있을 때
	{

		// 16진수 아스키 코드로 변환하여 출력
		CString hexStr;
		for (int i = 0; i < str.GetLength(); ++i)
		{
			char hexValue = static_cast<char>(str[i]);
			hexStr.AppendFormat(_T("%02X "), hexValue);
		}

		m_comm->Send(str, str.GetLength());

		// 줄바꿈 문자 추가
		hexStr += _T("\r\n");

		int insertPos = m_edit_rcv_view.LineIndex(0);
		SYSTEMTIME time;
		GetLocalTime(&time);
		CString currentDate;
		currentDate.Format(_T("S [%02d:%02d:%02d'%03ld]"), time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);

		m_edit_rcv_view.SetSel(insertPos, insertPos);
		m_edit_rcv_view.ReplaceSel(currentDate + _T(" : ") + hexStr);
		m_edit_rcv_view.SetSel(0, 0);

	}
}

[실행결과]



참고
https://blog.naver.com/loginpark/120089678114

0개의 댓글