2015년 7월 6일 월요일

C# WinFrom: 시리얼 포트 통신하기.

일단 프로젝트를 생성


"SerialTest" 라고 프로젝트를 생성했다.


요렇게 간단히 화면을 디자인.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO.Ports;

namespace SerialTest
{
    public partial class Form1 : Form
    {
        SerialPort sPort;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            btnOpen.Enabled = true;
            btnClose.Enabled = false;

            cboPortName.BeginUpdate();
            foreach (string comport in SerialPort.GetPortNames())
            {
                cboPortName.Items.Add(comport);
            }
            cboPortName.EndUpdate();

            cboPortName.SelectedItem = "COM4";
            txtBaudRate.Text = "9600";

            CheckForIllegalCrossThreadCalls = false;
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
                if (null == sPort)
                {
                    sPort = new SerialPort();
                    sPort.DataReceived += new SerialDataReceivedEventHandler(sPort_DataReceived);

                    sPort.PortName = cboPortName.SelectedItem.ToString();
                    sPort.BaudRate = Convert.ToInt32(txtBaudRate.Text);
                    sPort.DataBits = (int)8;
                    sPort.Parity = Parity.None;
                    sPort.StopBits = StopBits.One;
                    sPort.ReadTimeout = (int)500;
                    sPort.WriteTimeout = (int)500;
                    sPort.Open();
                }

                if (sPort.IsOpen)
                {
                    btnOpen.Enabled = false;
                    btnClose.Enabled = true;

                    MessageBox.Show("시리얼 포트를 연결했습니다.");
                }
                else
                {
                    btnOpen.Enabled = true;
                    btnClose.Enabled = false;
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] byteSendData= new byte[200];
            int iSendCount =0;
            try
            {
                if(true == chkSndHexa.Checked)
                {
                    foreach (string s in txtSend.Text.Split(' '))
                    {
                        if (s != null && s != "")
                        {
                            byteSendData[iSendCount++] = Convert.ToByte(s, 16);
                        }
                    }
                    sPort.Write(byteSendData, 0, iSendCount);
                }
                else
                {
                    sPort.Write(txtSend.Text);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int intRecSize = sPort.BytesToRead;
            string strRecData;

            if (intRecSize != 0)
            {
                strRecData = "";
                byte[] buff = new byte[intRecSize];

                sPort.Read(buff, 0, intRecSize);
                for (int iTemp = 0; iTemp < intRecSize; iTemp++)
                {
                    if (chkRecHexa.Checked)
                        { strRecData += buff[iTemp].ToString("X2") + " "; }
                    else
                        { strRecData += Convert.ToChar(buff[iTemp]); }
                }
                txtRec.Text += strRecData;
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (null != sPort)
            {
                if (sPort.IsOpen)
                {
                    sPort.Close();
                    sPort.Dispose();
                    sPort = null;
                }
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (null != sPort)
            {
                if (sPort.IsOpen)
                {
                    sPort.Close();
                    sPort.Dispose();
                    sPort = null;
                }
            }

            btnOpen.Enabled = true;
            btnClose.Enabled = false;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtRec.Clear();
        }
    }
}


소스는 이렇게 하면 되고...


com0com 을 이용해 COM4와 COM5 를 매칭.
com0com 설치 하는법 참조.


모니터링 할 Putty를 COM5 에다 연결.


테스트 준비 완료.

포트 연결.
보낼 데이터를 기록하고... "Send" 를 클릭하면...
데이터가 싸악~~~
터미널에서 키보드를 두둘기면... 아래 프로그램에 나타남....
"Rec Hexa" 가 체크 되어 있으면 전송된 값을 Hexa 코드로 보여줌.

"Snd Hexa" 가 체크 되어 있으면 Hexa 코드로 전송함.

Good ... -_-)b