페이지

글목록

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;

        }

댓글 없음:

댓글 쓰기