ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#]WPF Serial Port
    C#/기초 2021. 12. 21. 16:10

    연결 후  received함수를 스레드로.

    연결까지 스레드로 넘기면 나중에 다시 연결 시도할때 if(!serial.Isopen) 을 걸어도 진입하고 충돌을 일으킴.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO.Ports;
    using System.Diagnostics;
    
    
    namespace HumanDetector
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private ThreadManager thdManager;
            String[] portNumbers;
            SerialPort SP1 = new SerialPort();
            public MainWindow()
            {
                InitializeComponent();
                portNumbers = new String[4];
                portNumbers = SerialPort.GetPortNames();
    
            }
    
            private void rdoPixel32_Checked(object sender, RoutedEventArgs e)
            {
    
            }
    
            private void rdoPixel16_Checked(object sender, RoutedEventArgs e)
            {
                if (!SP1.IsOpen)
                {
                    SerialConnect(sender, e);
                }
                
            }
    
            private void SerialConnect(object sender, RoutedEventArgs e)
            {
                if (!SP1.IsOpen)
                {
                    SP1.PortName = portNumbers[0];
                    SP1.BaudRate = 115200;
                    SP1.DataBits = 8;
                    SP1.StopBits = StopBits.One;
                    SP1.Parity = Parity.None;
                    SP1.DataReceived += new SerialDataReceivedEventHandler(SP1_DataReceived);
    
                    SP1.Open();
    
                    Console.WriteLine("Port is Opened");
                }
                else
                {
                    SP1.Close();
                }
            }
    
            private void SP1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                Debug.WriteLine("Data Received:");
                Debug.Write(indata);
                
                //this.Invoke(new EventHandler(MySerialReceived));
            }
    
            private void MySerialReceived(object s, EventArgs e)
            {
                int ReceiveData = SP1.ReadByte();
    
            }
        }
    }

    public static void Main()
    {
        string name;
        string message;
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Thread readThread = new Thread(Read);
    
        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();
    
        // Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName(_serialPort.PortName);
        _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
        _serialPort.Parity = SetPortParity(_serialPort.Parity);
        _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
        _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
        _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);
    
        // Set the read/write timeouts
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
    
        _serialPort.Open();
        _continue = true;
        readThread.Start();
    
        Console.Write("Name: ");
        name = Console.ReadLine();
    
        Console.WriteLine("Type QUIT to exit");
    
        while (_continue)
        {
            message = Console.ReadLine();
    
            if (stringComparer.Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort.WriteLine(
                    String.Format("<{0}>: {1}", name, message));
            }
        }
    
        readThread.Join();
        _serialPort.Close();
    }
    
    public static void Read()
    {
        while (_continue)
        {
            try
            {
                string message = _serialPort.ReadLine();
                Console.WriteLine(message);
            }
            catch (TimeoutException) { }
        }
    }

    WPF 임의적 Thread 할당선언 example

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO.Ports;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfSerial
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            string name;
            string sMessage;
            StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
            bool tfContinue = false;
            Thread readThread;
            SerialPort sp = new SerialPort();
            //List<string> PortNameList = new List<string>();
    
            public MainWindow()
            {
                InitializeComponent();
    
                readThread = new Thread(Read);
    
                foreach (string comport in SerialPort.GetPortNames())
                {
                    //PortNameList.Add(comport);
                    cbPortList.Items.Add(comport);
                }
    
                cbPortList.SelectedIndex = 0;
    
                //cbPortList.ItemsSource = PortNameList;
    
                //string sPortName = cbPortList.SelectedValue as string;
                
                
            }
    
            public void Read()
            {
                while (tfContinue)
                {
                    try
                    {
                        sMessage = sp.ReadLine();
                        tbDisplay.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new Action(
                            delegate ()
                            {
                                tbDisplay.Text = sMessage;
                            })); 
                        Debug.WriteLine(sMessage);
                    }catch (Exception ex) { Debug.WriteLine(ex.Message); }
                }
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (!sp.IsOpen)
                {
                    try
                    {
                        sp.PortName = cbPortList.SelectedValue as string ?? "None"; // null이면 None
                        sp.BaudRate = 230400;
                        sp.Parity = Parity.None;
                        sp.DataBits = 8;
                        sp.StopBits = StopBits.One;
                        //sp.ReadBufferSize = 1024;
    
                        sp.ReadTimeout = 500;
                        sp.WriteTimeout = 500;
    
                        sp.Open();
                        tfContinue = true;
    
                        readThread.Start();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
                else
                {
                    sp.Dispose();
                    sp.Close();
                }
            }
    
            private void btStop_Click(object sender, RoutedEventArgs e)
            {
                tfContinue = false;
                readThread.Join();
                sp.Write("stop\r\n");
            }
    
            private void btDisconnect_Click(object sender, RoutedEventArgs e)
            {
                tfContinue = false;
                readThread.Join();
                sp.Close();
            }
    
            private void btStart_Click(object sender, RoutedEventArgs e)
            {
                tfContinue = true;
                readThread.Join();
                sp.Write("scan\r\n");
                readThread.Start();
            }
    
            private void Window_Closed(object sender, EventArgs e)
            {
                tfContinue = false;
                readThread.Join();
                //readThread.Abort();
                sp.Dispose();
                sp.Close();
            }
        }
    }
    728x90

    'C# > 기초' 카테고리의 다른 글

    [C#]LINQ  (0) 2022.02.21
    [C#]문법  (0) 2022.02.18
    WritePixels  (0) 2021.12.24
    [C#] ??, ?. 연산자 ( Nullable) Null 널  (0) 2021.12.16
    Delegate, Event, Action  (0) 2021.12.14

    댓글

Designed by Tistory.