여러가지 장비와 Serial통신 할 때 불편한 것이 있어서 아두이노의 시리얼 모니터를 참고하여 QT로 시리얼 통신 프로그램을 만들어 보았습니다.
프로젝트 파일 : https://github.com/fbqweasd/Serial_monitor
소스파일 : https://github.com/fbqweasd/Serial_monitor/blob/master/mainwindow.cpp
위 소스파일을 참고하여 주시길 바랍니다.
이 프로그램을 만들때 주요기능으로 생각한 기능로
- 기본적인 Serial통신 (수신 발신)
- 활성화된 시리얼포트 검색
- 시리얼 설정(보드)
이런 것을 추가해서 간단한 GUI를 만들어보자고 생각하였습니다.
최종 결과물
이러한 화면을 구성하였으며 상단에 위치한 컨포넌트들로 상태확인, 포트설정, 세부설정등을 할 수 있습니다.
시리얼 통신 부분 코드
QT에서 지원을 해주는 QtSerialPort
해더파일을 사용하면 쉽게 기능을 구현 할 수 있습니다.
시리얼 통신을 위한 여러가지 객체들을 선언한 모습인데 각 아래와 같은 같은 기능을 가지고 있습니다.
QPushButton : 데이터 입력 버튼
QSerialPort : 시리얼 통신 기본 정보 저장(포트, 통신속도등)
QLineEdit : 입력할 데이터 넣는 공간
QLabel : 수신된 데이터를 표시하는 라벨
여기 있는 객체 중 QSerialPort
라는 객체가 Serial설정을 하는데 중요한 역할을 합니다.
아래의 코드는 시리얼 통신 기본 설정을 하는 코드입니다.
구조체에 선언된 함수에 값을 넣어 주기만 하면 설정됩니다.
port->setPortName() : 포트 설정
port->setBaudRate() : 통신속도 (보드레이트) 설정
port->setDataBits() : 기본통신 비트 설정
port->setParity() : 장애비트 설정
port->setStopBits() : 스톱 비트 설정
port->setFlowControl() : 플로우컨르롤 설정
사실 Parity 비트 부터는 설정안해도 큰 상관이 없음
위의 코드는 콤보박스에 들어있는 활성화된 포트 이름을 가지고 와서 시리얼 포트를 설정하는 코드 입니다.
활성화된 포트를 찾아내는 코드는 다음 챕터에 설명되어 있습니다.
Windows 레지스트리 부분 코드
시리얼 포트를 조회하기 위해 여러가지의 방법이 있었는데 제일 자료가 많고 시스템에 부하를 주지 않는 방법이 Windows 레지스트리
를 조회하여 알아내는 것 입니다.
덕분에 Linux에서는 동작을 못하지만,,
위 코드가 레지스트리를 조회하는 코드 입니다. 살짝 수정하시면 QT 환경이 아니여도 활성화된 포트를 확인 하실 수 있습니다.
HKEY
변수는 윈도우 레지스트리를 접근 할 수 있는 변수 입니다. 이 변수에 원하는 레지스트리에 접근하는 방법은 RegOpenKey
라는 함수를 사용해서 연결합니다.
함수 사용 예 : RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), &hKey);
RegQueryValueEx(hKey, szName, NULL, &dwType, (LPBYTE)szData, &dwSize2);
이 함수로 레지스트리 값을 가지고 올 수 있습니다. szData 인자에 값을 넣어서 결과 값을 반환해 줍니다.