페이지

글목록

레이블이 c#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 c#인 게시물을 표시합니다. 모든 게시물 표시

2016년 3월 26일 토요일

[try_term] c#으로 통신 터미날 만들기 #3

안녕하세요, 다시 시간이 조금 나서 C# 공부를 시작했습니다.

오랜만에 다시하니 또 다 까먹어서 힘드네요.

이번에는 예전에 main 창에서 메뉴의 "시리얼포트"를 눌렀을 때, Connection 창을 1개 뜨도록 했는데
이 Connection창에서 여러가지 동작을 추가해 보겠습니다.

먼저 창이 뜨는데 까지는 예전 글에서 다뤘는데, 창이 뜰 때 기본으로 실행하는 함수인 xxx_Load() 함수를 만들어 보겠습니다.
오랜만에 다시 해서 또 다시 소스 파일에 코드를 직접 입력하는 우를 범해서 아무리 실행해도 초기화가 안되더군요.


다시 한 번 기억해야 겠습니다.
Load 함수는 반드시 전체 창을 선택해서 더블클릭이나 Enter Key를 눌러야 자동으로 생성되어 동작한다는 점을..


       private void frmConnection_Load(object sender, EventArgs e)
        {
        }

다음으로 콤보박스의 항목(Item) 리스트를 입력하고 그 중에 디폴트로 어떤 값을 선택하는 방법을 다뤄 보겠습니다.
1. 먼저 항목 리스트를 입력할 콤보박스를 선택하고 마우스로 우클릭을 합니다.

2. 항목 편집을 클릭하면 편집 창이 뜹니다.

3. 편집 창에 1줄에 1 항목씩 텍스트를 입력합니다.

4. 실행 시 입력한 항목들이 나타나고, 이것을 선택 할 수 있습니다.


5. 그러면 처음 실행시 여러 항목들 중, 기본(디폴트)으로 특정 항목을 선택해서 보여주려면 어떻게 할까요?
선택한 콤보박스의 파라메터 중 SelectedIndex 라는, 항목을 선택하는 것이 있습니다.
아까 만들었던 Load 함수 안에 각각의 콤보박스의 SelectedIndex 값에 처음 시작시 사용할 항목의 인덱스를 넣어주면 됩니다.
인덱스의 시작은 0 입니다.


        private void frmConnection_Load(object sender, EventArgs e)
        {
            // 사용가능한 시리얼 포트 얻기
            try
            {
                cbPortName.Items.AddRange(SerialPort.GetPortNames());
            }
            catch { }

            if (cbPortName.Items.Count > 0)
                cbPortName.SelectedIndex = 0;  // 컴포트 정보가 없을 경우 컴포트의 0번째를 사용


            cbBaudRates.SelectedIndex = 7;
            cbDataBit.SelectedIndex = 1;
            cbParityBit.SelectedIndex = 0;
            cbStopBit.SelectedIndex = 0;
            cbFlowControl.SelectedIndex = 2;

        }



다음으로 c# 초보라서 엄청 헤맨 것이 1개 있습니다.
마우스로만 '확인' 버튼을 눌러야 마무리 과정을 거쳐 창을 닫는데, 콤보박스에 항목을 선택하고 Enter 키를 눌렀을 때도
확인 버튼을 누른 것과 같이 동작하도록 해 보겠습니다.
xxx_KeyUp() 이라는 함수가 있는데, 키가 눌렸다가 떨어질 때 발생하는 이벤트에 의해 동작하는 함수입니다.
이 함수를 이용하여 특정 콤포넌트에서 키가 떨어졌을 때, 해당 함수가 생행되는 원리 입니다.
이 함수 내에서 키가 Enter 키인지를 체크해서 '확인' 버튼이 눌렸을 때의 동작을 강제로 실행하게 합니다.


        private void cbPortName_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbBaudRates_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbDataBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbParityBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbStopBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbFlowControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void tb_DelayCh_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void tb_DelayLine_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }


그런데 여기서부터가 문제였습니다. 아무리 Enter 키를 눌러도 생각한데로 동작이 안되는 것입니다.
원인은 이벤트와 함수가 연결되어있지 않아서 였습니다.

이 함수에 이벤트를 연결하려면, 
1. 디자인 파일탭으로 가서 해당 콤포넌트의 속성 창의 이벤트 아이콘을 클릭합니다.

2. '키' 항목의 KeyUp 의 우측 파라메터에서 선택한 콤포넌트에 해당하는, 아까 소스코드에 만들어 놓았던 xxx_KeyUp() 함수를 선택해 줍니다.


3. 그리고 나서 빌드하고 실행해 보면 잘 동작합니다. (휴.. 이건 제가 아무리 구글 검색을 해봐도 못 찾아서 자체 노동력으로 해결했습니다)


마지막으로 시리얼 포트에 대한 내용을 맛보기로 하나 다뤄 보겠습니다.
포트 이름은 현재 있는 포트내에서 선택을 해야 되기 때문에, 아얘 없을 수도 있고 매번 이름이 달라서,
현재 존재하는 포트이름을 스캔해서 표시해야 합니다.
SerialPort.GetPortNames() 함수를 이용해서 현재 포트 이름들을 가져옵니다.
Load 함수에서 이 함수를 이용해서 포트이름을 나타내는 콤보박스에 포트들을 정렬해서 리스트 항목에 넣어 표시합니다.

코드 예제)


        private void frmConnection_Load(object sender, EventArgs e)
        {
            // 사용가능한 시리얼 포트 얻기
            try
            {
                cbPortName.Items.AddRange(SerialPort.GetPortNames());
            }
            catch { }

            if (cbPortName.Items.Count > 0)
                cbPortName.SelectedIndex = 0;  // 컴포트 정보가 없을 경우 컴포트의 0번째를 사용


            cbBaudRates.SelectedIndex = 7;
            cbDataBit.SelectedIndex = 1;
            cbParityBit.SelectedIndex = 0;
            cbStopBit.SelectedIndex = 0;
            cbFlowControl.SelectedIndex = 2;

        }

2016년 3월 5일 토요일

[try_term] c#으로 통신 터미날 만들기 #1

예전부터 c# 책을 사서 출퇴근시 읽곤 했는데,
정리가 안되어 블로그에 글을 쓰면서 자료를 남기고자 합니다.

자료를 정리를 안하다 보니, 매번 처음부터 다시 시작하고 다음 번에 연결해서 프로그램을 만들어보고자 할 때
전혀 생각이 안나는군요.

윈도우 프로그램으로 예전에 Labview 를 주로 쓰다가, c#으로 갈아타려고 했는데 배워야 할 것이 많아서
아직도 거의 기초를 해메고 있습니다.

일단, 펌웨어 테스트시 주로 UART 통신을 많이 하니까 터미날 프로그램을 만들어 보려고 합니다.

다행히 여기저기 참고할 사이트가 많네요.

먼저 비주얼 스투디오를 깔았고, 새로운 프로젝트를 이름은 try_term 으로 만들었습니다.
여기에 MenuStrip SplitContainer,TextBox 를 추가했습니다.

*1번 : SplitContainer, 참조 사이트 링크

나중에 툴팁이라는 것을 사용하기위해 설명이 잘된 사이트를 찾아 보았습니다. (링크)
툴팀의 정의 : Tooltip 컨트롤은 특정 컨트롤에 마우스를 올려 놓으면 간단한 도움말을 보여줄 때 쓰여지는 컨트롤이다.

아, 그리고 이 프로그램을 참고한 사이트(링크)가 있는데, 처음에는 이 프로그램 소스랑 비슷하게 해보고
점점 프로그램을 추가/수정해 나아갈 것입니다. 참 많은 도움이 됩니다.
원 제작자의 디자인은 아래와 같습니다.


그래서 위의 디자인처럼 SplitContainer 를 넣고, 설정을 
Dock : None 으로 전체 프레임에서 떨어뜨려 놓았고, 
Anchor : Bottom,Left,Right 로 하여 전체 프레임을 마우스로 변경해도 왼쪽,오른쪽,아래에 붙어서 같은 비율로 조정됩니다.

다음은 SplitContainer 의 왼쪽과 오른쪽에 TextBox 를 넣고 dock 를 Fill 로 설정하여 전체 크기에 맞게 조정되도록 설정했습니다.


그리고 TextBox 의 우측 위의 > 아이콘을 누르면 MultiLine 으로 만들 수 있습니다.

다음으로 메뉴를 만드는 기능인 MenuStrip 을 왼쪽 도구상자에서 끄집어다 왼쪽 위에다 붙여서 편집 합니다.
#1 설정,시리얼 포트,통신 끊기
#2 전송,파일 보내기,X-modem 전송

다음으로 또 다른 윈도우 폼을 만들어 봅시다. 이 기능은 나중에 메뉴를 선택하면 또 다른 창을 띄우기 위한 용도로 쓰일 예정입니다.
[새로운 폼 만들기]



이름을 frmConnection.cs 로 하고 추가를 눌렀더니 다음과 같이 폼이 새로 만들어 졌습니다.