CHOU

[MSRDS] C#으로 시리얼 통신 이용하기 본문

Tech/Microsoft Products

[MSRDS] C#으로 시리얼 통신 이용하기

chobabo 2009. 4. 7. 12:01


 MSRDS로 서비스를 개발하면서 시리얼 통신을 이용하게 되는데 이때, 개발하려는 요구조건에 맞게 미리 시리얼 통신을 만들어 놓으면 훨씬 편리합니다. 이번에도 네이버 MSRDS 카페에 김영준 수석 님께서 올려 놓은 예제를 수행하면서 이해해 보겠습니다. 

1. Visual Studio 를 실행하여 C# Application 을 실행하고, using 을 이용하여 using System.IO.Ports 를 추가해 줍니다.


그림1. 코드 추가 화면


2. 다음은 윈폼에다가 시리얼 통신을 하기위한 Port Open, Port Close 버튼과 시리얼 통신이 수행되기 위한 예제 버튼, 리스트 박스 버튼을 생성합니다.


그림2. 윈폼 생성화면

3. 각각의 버튼에 대한 이벤트와 함수코드를 아래와 같이 작성합니다.

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;

//add code
using System.IO.Ports;

namespace TestSerialPort
{
    public partial class Form1 : Form
    {
        //add code--------
        SerialPort serialPort = new System.IO.Ports.SerialPort();

        int readCnt = 0;
        byte recvByte = 0;
        byte[] recvBuf = new byte[1024];

        //----------------

        public Form1()
        {
            InitializeComponent();
        }

        private void PortOpenButton_Click(object sender, EventArgs e)
        {
            Open(System.Int32.Parse(SRtxtBox.Text), System.Int32.Parse(BRtxtBox.Text));

            listBox1.Items.Add("Port Open Success");
        }

        private void PortCloseButton_Click(object sender, EventArgs e)
        {
            serialPort.Close();

            listBox1.Items.Add("Port Close Success");
        }

        private void Example_Click(object sender, EventArgs e)
        {
            //10 byte value
            byte[] buf = new byte[10];

            buf[0] = 00;
            buf[1] = 01;
            buf[2] = 02;
            buf[3] = 03;
            buf[4] = 04;
            buf[5] = 05;
            buf[6] = 06;
            buf[7] = 07;
            buf[8] = 08;
            buf[9] = 09;

            serialPort.Write(buf, 0, buf.Length);

            //listBox1.Items.Add(serialPort.ReadBufferSize.ToString());
        }

        void Open(int comPort, int baudRate)
        {
            serialPort = new SerialPort("COM" + comPort.ToString(), baudRate);
            serialPort.Encoding = Encoding.Default;
            serialPort.Parity = Parity.None;
            serialPort.DataBits = 8;
            serialPort.StopBits = StopBits.One;
            serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
            serialPort.Open();
        }

        void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (serialPort.BytesToRead >= 0)
            {
                readCnt = serialPort.Read(recvBuf, 0, 1024);
                recvByte = recvBuf[readCnt - 1];

                listBox1.Items.Add(readCnt.ToString());
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);

            CheckForIllegalCrossThreadCalls = false;
        }
    }
}

4. 위의 코드가 올바로 삽입되었다면, 아래와 같은 영상이 실행됩니다. 기본적인 시리얼 통신만 구현되어 있는거라 별로 볼게 없지만 시리얼 통신 서비스를 만들기 위한 가장 기초적인 부분이라고 보시면 될 듯 합니다.


영상1. 실행결과 영상


참고자료

1. http://cafe.naver.com/msrskorea


2. 예제 코드 파일