시리얼통신에 대해서 학습했고, 학습한 것을 토대로 어색한 c#과 winform에 익숙해지기 위해서 간단하게 시리얼 통신을 구현해보기로 했다.
c#에는 WinForm을 통해서 PC와 외부장치를 연결하기 위한 GUI를 만들고 만들어 보았다.
자주 사용할 것 같으니, 사용한 도구상자를 나열해보자
Label
Combobox
Button
Textbox
먼저 이 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이 나와서 예외처리를 따로 해줘야 한다.