본문 바로가기
.Net/WPF

C# WPF Serial 통신 연결

by Cum 2022. 9. 27.
728x90
반응형

가끔 사용하는 C# Serial 통신

사용할때 마다 잊어버려서 기록해놓으려고 한다.

UI는 WPF로 작성

using System;
using System.Collections;
using System.IO.Ports;
using System.Threading;
using System.Windows;
using System.Windows.Threading;

namespace robot_arduino_test
{
    public partial class MainWindow : Window
    {
        Queue Data = new Queue(); //데이터 저장 큐
        SerialPort sp = new SerialPort();
        string T_msg = ""; //WPF Text 저장용

        public MainWindow()
        {
            InitializeComponent();

            cbx_Port.ItemsSource = SerialPort.GetPortNames();
            Thread t = new Thread(text);
            t.IsBackground = true;
            t.Start();
        }

        private void btn_Conn_Click(object sender, RoutedEventArgs e)
        {
            if (!sp.IsOpen)
            {
                sp.PortName = cbx_Port.Text;
                sp.BaudRate = Convert.ToInt16(cbx_BaudRate.Text);
                sp.DataBits = 8;
                sp.StopBits = StopBits.One;
                sp.Parity = Parity.None;
                sp.DataReceived += new SerialDataReceivedEventHandler(serial_Received);
                sp.Open();

                lbl_Conn.Content = "Port Connected!";
            }
            else
            {
                lbl_Conn.Content = "Already Connected!";
            }
        }

        private void serial_Received(object sender, SerialDataReceivedEventArgs e)
        {
            string getData = sp.ReadExisting();
            Data.Enqueue(getData);
            Thread.Sleep(1);
        }

        private void text()
        {
            while (true)
            {
                if (Data.Count > 0)
                {
                    Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
                    {
                        string msg = DateTime.Now.ToString("HH:mm:ss.fff");
                        var ReceiveData = Data.Dequeue();

                        msg = string.Format("{0} : {1}\r\n", msg, ReceiveData);
                        T_msg = string.Format("{0} : {1}", T_msg, msg);
                        T_text_list.Text = T_msg;
                        T_text_list.SelectionStart = T_text_list.Text.Length;
                        T_text_list.ScrollToEnd();
                    }));
                }
                Thread.Sleep(10);
            }
        }

        private void btn_Close_Click(object sender, RoutedEventArgs e)
        {
            if (sp.IsOpen)
            {
                sp.Close();
                lbl_Conn.Content = "Port Close!";
            }
            else
            {
                lbl_Conn.Content = "Already Close!";
            }
        }
    }
}

 

728x90
반응형

'.Net > WPF' 카테고리의 다른 글

.NetCore 배포 폴더 만들기  (0) 2023.06.12
C#/WPF MainWindow Dual monitor setup  (0) 2022.09.16

댓글