C# Winform으로 간단한 시리얼통신 구현하기

Today Jeeho Learned·2022년 11월 7일
0

C#

목록 보기
1/17
post-thumbnail

Intro

시리얼통신에 대해서 학습했고, 학습한 것을 토대로 어색한 c#과 winform에 익숙해지기 위해서 간단하게 시리얼 통신을 구현해보기로 했다.

Form 구현

c#에는 WinForm을 통해서 PC와 외부장치를 연결하기 위한 GUI를 만들고 만들어 보았다.
자주 사용할 것 같으니, 사용한 도구상자를 나열해보자

Label

  • COM, BaudRate와 같이 이름을 작성하는 것이다.

Combobox

  • COM, BaudRate 옆에서 아래로 내려가는 화살표, 해당 요소를 고를수있는 영역을 말한다.
  • 이 부분의 요소들을 내가 직접 추가해줄수도 있고, PC내에 있는 것을 받아와서 넣어줄 수도있다.

Button

  • 연결, 해제 부분이다.
  • 클릭시에 일어나는 메소드를 직접 작성하고, 정리할 수 있다.

Textbox

  • 폼 우편에 빈 칸을 말한다.
  • text를 계속해서 받아줄 수 있다.

먼저 이 4가지의 요소로만 간단하게 구현해보았다.

도구에서 SerialPort를 꼭 추가해준다!

소스 코드 구성

시리얼 통신을 하기 위해서 using System.IO.Ports를 추가해줘야 한다. 여기에는 직렬 포트를 제어하는 클래스가 포함되어있다.

시리얼 통신을 하기위해서 필요한 통신 규약이다. 각 라인마다 주석을 참고하면 된다.
윈폼을 사용하여 구성한 경우 코드로 작성할 필요는없다. 라이브러리를 사용해서 클래스를 직접 만든 경우에는 초기화를 해 줄 필요가 있다.


InitailizeComponent() 메서드는 디자이너 단에 정의된 폼 컴포넌트 정의를 호출하는 녀석이다.
윈폼을 만들고 디자인 한 내용을 적용시키기 위해서 필요하고, 정의된 내용대로 표시해준다는 말이다.
PortNames배열에 시리얼포트의 이름들을 가지고 와서 넣어준다.
그리고 이런 시리얼 포트이름들을 portnumber로 선언해주고, 첫번째 콤보박스에 넣어준다. combox로 오타가 낫다ㅋㅎ

전체 코드

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace Serial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            string[] PortNames = SerialPort.GetPortNames();
            foreach (string portnumber in PortNames)
            {
                Port_Combox.Items.Add(portnumber);          // 검색한 포트를 콤보박스에 입력. 
            }


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

            if (serialPort1.IsOpen == false) //닫혀있을때
            {
                serialPort1.PortName = Port_Combox.SelectedItem.ToString(); //콤보박스에서 고른 것을 포트네임으로 넣어준다
                serialPort1.BaudRate = int.Parse(comboBox2.SelectedItem.ToString()); //콤보박스에서 고른 것(string)을 int로 변경해서 넣어준다.
                serialPort1.DataBits = 8; // 8비트 데이터 전송은 고정
                serialPort1.StopBits = StopBits.One; // stop비트는 1로 고정
                serialPort1.Parity = Parity.None; // 패리티비트는 없는 걸로
                serialPort1.Open(); // 포트를 열어준다

            }

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

        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                textBox1.Text += "해제되었습니다" + Environment.NewLine;
            }
            else textBox1.Text += "해제되어 있습니다." + Environment.NewLine;
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.SelectionStart = textBox1.TextLength;
            textBox1.ScrollToCaret();

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

        }
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

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

        }
    }
}

아쉬운 것은 내 PC에 포트를 연결할 수가 없어서 실질적인 테스트를 하지 못했다..
그래서 포트이름을 찾는 부분에서 null이 나와서 예외처리를 따로 해줘야 한다.

profile
기록해야 (살아)남는다 !

0개의 댓글