-
[C#]WPF Serial PortC#/기초 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 댓글