본문 바로가기

프로그래밍/[C#]

[C#]시리얼 포트읽기 최소기능, 이벤트 핸들러

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 RecDB_Csharp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(comboBox1_Load);
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
        }
       
        private void comboBox1_Load(object sender, EventArgs e)
        {
            foreach (string comport in SerialPort.GetPortNames())
            {
                comboBox1.Items.Add(comport);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.SelectedItem.ToString();
            serialPort1.Open();
            if(serialPort1.IsOpen)
            {
                textBox1.AppendText(serialPort1.PortName + " Open");
            }
            else
            {
                textBox1.AppendText("fail to open");
            }
            
            serialPort1.ReadLine();//ReadByte, ReadChar, ReadExisting, ReadLine 중 필요한 메소드를 골라서 사용, SerialPort가 데이터를 받으면 serialPort1_DataReceved 같은 event handler 가 호출된다.
        }
        
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }

        private void SerialReceived(object sender, EventArgs e)
        {
            String strRecive = serialPort1.ReadExisting();
            textBox1.AppendText(strRecive);
        }
  
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(SerialReceived));
        }

      
    }
}

 

exception control 하나도 없는 mvp모델이다.

 

시리얼 포트에서 데이터가 들어오면 serialPort1.DataReceived 이벤트가 발생한다.

해당 이벤트가 발생할때 new SerialDataReceivedEventHandler(serialPort1_DataReceived); 를 엮어주어 serialPort1_DataReceived함수가 실행되도록 하였다.

시리얼 통신은 보조 스레드에서 실행 되기 때문에 메인 쓰레드에 있는 testbox1에 값을 써주거나 할 수 없다.

때문에 this.Invoke(new EventHandler(SerialReceived)); 를 통해 메인쓰레드의 함수를 실행 하였다.

Serial Port. Data Received Event공식 문서