기본 콘텐츠로 건너뛰기

C# - Serial Port ASCII/HEX Format

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 SerialTest1
{
    public partial class Form1 : Form
    {
        delegate void MyDelegate();      //델리게이트 선언(크로스 쓰레드 해결하기 위한 용도)
        bool SendForamt = true;          // true : ASCII   false : HEX
        bool ReceiveFormat = true;       // true : ASCII   false : HEX
        public Form1()
        {
            InitializeComponent();
            this.Disposed += new EventHandler(Form1_Disposed);
        }
        void Form1_Disposed(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.DataReceived -= new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                serialPort1.Close();
            }
        }
        void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] array = new byte[1024];
            int temp;
            string str = string.Empty;
            temp = serialPort1.Read(array, 0, 1024);
            //아스키 값으로 받기
            if (ReceiveFormat)
            {
                MyDelegate dt = delegate()
                {
                    txt1.Text += "Receive Data : ";
                    for (int i = 0; i < temp; i++)
                    {
                        txt1.Text += (char)array[i];
                    }
                    txt1.Text += "\r\n";
                };
                this.Invoke(dt);
              
            }
            //HEX 값으로 받기
            else
            {
              
                for (int i = 0; i < temp; i++)
                {
                    str += string.Format("{0:x2} ", array[i]);
                }
                //헥사로 바꿔서 출력
                MyDelegate dt = delegate()
                {
                    txt1.Text += "Receive Data : ";
                    txt1.Text += str;
                    txt1.Text += "\r\n";
                };
                this.Invoke(dt);
            }
        }
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                //아스키 형태로 보내라
                if (SendForamt)
                {
                    serialPort1.Write(txt2.Text);
                }
                //HEX 형태로 보내라
                else
                {
                    string str = string.Empty;
                    byte[] arr = Encoding.ASCII.GetBytes(txt2.Text.ToCharArray());
                    foreach (byte b in arr)
                    {
                        str += string.Format("{0:x2} ", b);
                    }
                    serialPort1.Write(str);
                }
            }
            else
            {
                MessageBox.Show("포트가 연결되지 않았습니다.");
            }
        }
        private void cb1_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.PortName = cbPortName.Text;
        }
        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Open();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                btnClose.Enabled = true;
                btnOpen.Enabled = false;
            }
            catch
            {
                MessageBox.Show("해당포트의 연결을 다시 확인하십시요");
            }
          
        }
        private void btnClose_Click(object sender, EventArgs e)
        {
            serialPort1.DataReceived -= new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Close();
            btnClose.Enabled = false;
            btnOpen.Enabled = true;
        }
        private void btnClear_Click(object sender, EventArgs e)
        {
            txt1.Text = "";
        }
        private void cbReceiveFormat_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbReceiveFormat.Text == "ASCII")
            {
                ReceiveFormat = true;
            }
            else
            {
                ReceiveFormat = false;
            }
        }
        private void cbSendFormat_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbSendFormat.Text == "ASCII")
            {
                SendForamt = true;
            }
            else
            {
                SendForamt = false;
            }
        }
        private void cbBaudrate_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.BaudRate = int.Parse(cbBaudrate.Text);
        }
        private void cbDataBits_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.DataBits = int.Parse(cbDataBits.Text);
        }
        private void cbStopBits_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch(cbStopBits.SelectedIndex)
            {
                case 0:
                    serialPort1.StopBits = StopBits.One;
                    break;
                case 1:
                    serialPort1.StopBits = StopBits.Two;
                    break;
                default :
                    serialPort1.StopBits = StopBits.One;
                    break;
            }
          
        }
        private void cbParity_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (cbStopBits.SelectedIndex)
            {
                case 0:
                    serialPort1.Parity = Parity.None;
                    break;
                case 1:
                    serialPort1.Parity = Parity.Odd;
                    break;
                case 2:
                    serialPort1.Parity = Parity.Even;
                    break;
                default:
                    serialPort1.Parity = Parity.None;
                    break;
            }
        }
    }
}


출처: https://alsrns5052.tistory.com/entry/C-시리얼-통신 [Min's life]

댓글

이 블로그의 인기 게시물

C# - Windows Form 에 있는 control 찾기

// 아래 코드는 form 의 최상위 control만 찾을 수 있음. // panle, groubbox ... 내부에 있는 control은 찾지 못함. Control GetControlByName(string Name) {     foreach (Control c in this.Controls)         if (c.Name == Name)             return c;     return null; } // form 의 모든 control을 찾을 수 있음. string name = "btnBit" + (i + 1).ToString("D2"); var tmpBtn = this.Controls.Find(name, true).FirstOrDefault(); if (tmpBtn != null) {     if (value == 1) tmpBtn.BackColor = Color.Lime;     else tmpBtn.BackColor = Color.Gray; }

C# - ARGB 색상

속성 A 이  Color  구조체의 알파 구성 요소 값을 가져옵니다. Alice Blue ARGB 값이  #FFF0F8FF 인 시스템 정의 색을 가져옵니다. Antique White ARGB 값이  #FFFAEBD7 인 시스템 정의 색을 가져옵니다. Aqua ARGB 값이  #FF00FFFF 인 시스템 정의 색을 가져옵니다. Aquamarine ARGB 값이  #FF7FFFD4 인 시스템 정의 색을 가져옵니다. Azure ARGB 값이  #FFF0FFFF 인 시스템 정의 색을 가져옵니다. B 이  Color  구조체의 파랑 구성 요소 값을 가져옵니다. Beige ARGB 값이  #FFF5F5DC 인 시스템 정의 색을 가져옵니다. Bisque ARGB 값이  #FFFFE4C4 인 시스템 정의 색을 가져옵니다. Black ARGB 값이  #FF000000 인 시스템 정의 색을 가져옵니다. Blanched Almond ARGB 값이  #FFFFEBCD 인 시스템 정의 색을 가져옵니다. Blue ARGB 값이  #FF0000FF 인 시스템 정의 색을 가져옵니다. Blue Violet ARGB 값이  #FF8A2BE2 인 시스템 정의 색을 가져옵니다. Brown ARGB 값이  #FFA52A2A 인 시스템 정의 색을 가져옵니다. Burly Wood ARGB 값이  #FFDEB887 인 시스템 정의 색을 가져옵니다. Cadet Blue ARGB 값이  #FF5F9EA0 인 시스템 정의 색을 가져옵니다. Chartreuse ARGB 값이  #FF7FFF00 인 시스템 정의 색을 가져옵니다. Chocolate ARGB 값이  #FFD2691E 인 시스템 정의 색을 가져옵니다. Coral ARGB ...