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)); 를 통해 메인쓰레드의 함수를 실행 하였다.
'프로그래밍 > [C#]' 카테고리의 다른 글
[C#]콤보박스 드랍다운 메뉴 Load의 3가지 방법 (0) | 2020.03.03 |
---|---|
[C#] String에서 empty와 null의 차이 (0) | 2020.03.02 |