diff --git a/MySolution/MySolution.sln b/MySolution/MySolution.sln
index f84d375..f27f0aa 100644
--- a/MySolution/MySolution.sln
+++ b/MySolution/MySolution.sln
@@ -3,20 +3,29 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SerialCommApp", "SerialComApp\SerialCommApp.csproj", "{21CB97AA-1550-4C56-894D-76E6B75B91DC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF3FAEF8-E438-4E8C-9A99-C0A94649EFEE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21CB97AA-1550-4C56-894D-76E6B75B91DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21CB97AA-1550-4C56-894D-76E6B75B91DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21CB97AA-1550-4C56-894D-76E6B75B91DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21CB97AA-1550-4C56-894D-76E6B75B91DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {FDB80B27-48D0-459C-B186-EDC205130707}
EndGlobalSection
EndGlobal
diff --git a/MySolution/SerialComApp/App.config b/MySolution/SerialComApp/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/MySolution/SerialComApp/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MySolution/SerialComApp/Dialogs/CommSettingDialog.Designer.cs b/MySolution/SerialComApp/Dialogs/CommSettingDialog.Designer.cs
new file mode 100644
index 0000000..faad714
--- /dev/null
+++ b/MySolution/SerialComApp/Dialogs/CommSettingDialog.Designer.cs
@@ -0,0 +1,117 @@
+namespace SerialCommApp.Dialogs
+{
+ partial class CommSettingDialog
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CommSettingDialog));
+ this.pgrComm = new System.Windows.Forms.PropertyGrid();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.okButton = new System.Windows.Forms.Button();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.tableLayoutPanel2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // pgrComm
+ //
+ this.pgrComm.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pgrComm.Location = new System.Drawing.Point(3, 3);
+ this.pgrComm.Name = "pgrComm";
+ this.pgrComm.Size = new System.Drawing.Size(335, 214);
+ this.pgrComm.TabIndex = 0;
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.ColumnCount = 1;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel1.Controls.Add(this.pgrComm, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 1);
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 2;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(341, 255);
+ this.tableLayoutPanel1.TabIndex = 1;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.ColumnCount = 2;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));
+ this.tableLayoutPanel2.Controls.Add(this.okButton, 1, 0);
+ this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 223);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 1;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(335, 29);
+ this.tableLayoutPanel2.TabIndex = 1;
+ //
+ // okButton
+ //
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.okButton.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.okButton.Location = new System.Drawing.Point(238, 3);
+ this.okButton.Name = "okButton";
+ this.okButton.Size = new System.Drawing.Size(94, 23);
+ this.okButton.TabIndex = 0;
+ this.okButton.Text = "Apply";
+ this.okButton.UseVisualStyleBackColor = true;
+ //
+ // CommSettingDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(341, 255);
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "CommSettingDialog";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Serial Communication Setting";
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PropertyGrid pgrComm;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ private System.Windows.Forms.Button okButton;
+ }
+}
\ No newline at end of file
diff --git a/MySolution/SerialComApp/Dialogs/CommSettingDialog.cs b/MySolution/SerialComApp/Dialogs/CommSettingDialog.cs
new file mode 100644
index 0000000..2d24c06
--- /dev/null
+++ b/MySolution/SerialComApp/Dialogs/CommSettingDialog.cs
@@ -0,0 +1,30 @@
+using SerialCommApp.SeriallLibs;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace SerialCommApp.Dialogs
+{
+ public partial class CommSettingDialog : Form
+ {
+ public PSerialCommSetting Setting { get; set; }
+
+ public CommSettingDialog(PSerialCommSetting setting)
+ {
+ InitializeComponent();
+ InitInstance(setting);
+ }
+
+ private void InitInstance(PSerialCommSetting setting)
+ {
+ this.Setting = setting;
+ pgrComm.SelectedObject = this.Setting;
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/Dialogs/CommSettingDialog.resx b/MySolution/SerialComApp/Dialogs/CommSettingDialog.resx
new file mode 100644
index 0000000..89cb1fa
--- /dev/null
+++ b/MySolution/SerialComApp/Dialogs/CommSettingDialog.resx
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ Yiq7Dov2LgAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/MySolution/SerialComApp/Program.cs b/MySolution/SerialComApp/Program.cs
new file mode 100644
index 0000000..016c012
--- /dev/null
+++ b/MySolution/SerialComApp/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace SerialCommApp
+{
+ internal static class Program
+ {
+ ///
+ /// 해당 애플리케이션의 주 진입점입니다.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new SerialCommApp());
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/Properties/AssemblyInfo.cs b/MySolution/SerialComApp/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..6cefab9
--- /dev/null
+++ b/MySolution/SerialComApp/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
+// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
+// 이러한 특성 값을 변경하세요.
+[assembly: AssemblyTitle("SerialCommApp")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SerialComApp")]
+[assembly: AssemblyCopyright("Copyright © 2023")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
+// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
+// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
+[assembly: ComVisible(false)]
+
+// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
+[assembly: Guid("21cb97aa-1550-4c56-894d-76e6b75b91dc")]
+
+// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
+//
+// 주 버전
+// 부 버전
+// 빌드 번호
+// 수정 버전
+//
+// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
+// 기본값으로 할 수 있습니다.
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/MySolution/SerialComApp/Properties/Resources.Designer.cs b/MySolution/SerialComApp/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..814fe10
--- /dev/null
+++ b/MySolution/SerialComApp/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// 이 코드는 도구를 사용하여 생성되었습니다.
+// 런타임 버전:4.0.30319.42000
+//
+// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+// 이러한 변경 내용이 손실됩니다.
+//
+//------------------------------------------------------------------------------
+
+namespace SerialCommApp.Properties {
+ using System;
+
+
+ ///
+ /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
+ ///
+ // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
+ // 클래스에서 자동으로 생성되었습니다.
+ // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
+ // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SerialCommApp.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
+ /// 재정의합니다.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/Properties/Resources.resx b/MySolution/SerialComApp/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/MySolution/SerialComApp/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MySolution/SerialComApp/Properties/Settings.Designer.cs b/MySolution/SerialComApp/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..0d6935a
--- /dev/null
+++ b/MySolution/SerialComApp/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// 이 코드는 도구를 사용하여 생성되었습니다.
+// 런타임 버전:4.0.30319.42000
+//
+// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+// 이러한 변경 내용이 손실됩니다.
+//
+//------------------------------------------------------------------------------
+
+namespace SerialCommApp.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/Properties/Settings.settings b/MySolution/SerialComApp/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/MySolution/SerialComApp/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/MySolution/SerialComApp/SerialCommApp.Designer.cs b/MySolution/SerialComApp/SerialCommApp.Designer.cs
new file mode 100644
index 0000000..f54a431
--- /dev/null
+++ b/MySolution/SerialComApp/SerialCommApp.Designer.cs
@@ -0,0 +1,244 @@
+namespace SerialCommApp
+{
+ partial class SerialCommApp
+ {
+ ///
+ /// 필수 디자이너 변수입니다.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 사용 중인 모든 리소스를 정리합니다.
+ ///
+ /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form 디자이너에서 생성한 코드
+
+ ///
+ /// 디자이너 지원에 필요한 메서드입니다.
+ /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SerialCommApp));
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.connectButton = new System.Windows.Forms.Button();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.settingButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.portComboBox = new System.Windows.Forms.ComboBox();
+ this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
+ this.sendButton = new System.Windows.Forms.Button();
+ this.commandText = new System.Windows.Forms.TextBox();
+ this.printText = new System.Windows.Forms.TextBox();
+ this.portRefreshButton = new System.Windows.Forms.Button();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.tableLayoutPanel2.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.tableLayoutPanel3.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.BackColor = System.Drawing.Color.White;
+ this.tableLayoutPanel1.ColumnCount = 1;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel3, 0, 2);
+ this.tableLayoutPanel1.Controls.Add(this.printText, 0, 1);
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 3;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(583, 679);
+ this.tableLayoutPanel1.TabIndex = 6;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.BackColor = System.Drawing.Color.White;
+ this.tableLayoutPanel2.ColumnCount = 3;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 350F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));
+ this.tableLayoutPanel2.Controls.Add(this.connectButton, 2, 0);
+ this.tableLayoutPanel2.Controls.Add(this.panel1, 0, 0);
+ this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 4);
+ this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 1;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(577, 32);
+ this.tableLayoutPanel2.TabIndex = 6;
+ //
+ // connectButton
+ //
+ this.connectButton.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.connectButton.Location = new System.Drawing.Point(480, 4);
+ this.connectButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.connectButton.Name = "connectButton";
+ this.connectButton.Size = new System.Drawing.Size(94, 24);
+ this.connectButton.TabIndex = 1;
+ this.connectButton.Text = "Connect";
+ this.connectButton.UseVisualStyleBackColor = true;
+ this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.portRefreshButton);
+ this.panel1.Controls.Add(this.settingButton);
+ this.panel1.Controls.Add(this.label1);
+ this.panel1.Controls.Add(this.portComboBox);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Margin = new System.Windows.Forms.Padding(0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(350, 32);
+ this.panel1.TabIndex = 2;
+ //
+ // settingButton
+ //
+ this.settingButton.Location = new System.Drawing.Point(207, 3);
+ this.settingButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.settingButton.Name = "settingButton";
+ this.settingButton.Size = new System.Drawing.Size(68, 24);
+ this.settingButton.TabIndex = 1;
+ this.settingButton.Text = "Setting";
+ this.settingButton.UseVisualStyleBackColor = true;
+ this.settingButton.Click += new System.EventHandler(this.settingButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(2, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(29, 15);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Port";
+ //
+ // portComboBox
+ //
+ this.portComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.portComboBox.FormattingEnabled = true;
+ this.portComboBox.Location = new System.Drawing.Point(37, 4);
+ this.portComboBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.portComboBox.Name = "portComboBox";
+ this.portComboBox.Size = new System.Drawing.Size(116, 23);
+ this.portComboBox.TabIndex = 0;
+ //
+ // tableLayoutPanel3
+ //
+ this.tableLayoutPanel3.BackColor = System.Drawing.Color.White;
+ this.tableLayoutPanel3.ColumnCount = 2;
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));
+ this.tableLayoutPanel3.Controls.Add(this.sendButton, 1, 0);
+ this.tableLayoutPanel3.Controls.Add(this.commandText, 0, 0);
+ this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 643);
+ this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.tableLayoutPanel3.Name = "tableLayoutPanel3";
+ this.tableLayoutPanel3.RowCount = 1;
+ this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel3.Size = new System.Drawing.Size(577, 32);
+ this.tableLayoutPanel3.TabIndex = 6;
+ //
+ // sendButton
+ //
+ this.sendButton.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.sendButton.Location = new System.Drawing.Point(480, 4);
+ this.sendButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.sendButton.Name = "sendButton";
+ this.sendButton.Size = new System.Drawing.Size(94, 24);
+ this.sendButton.TabIndex = 1;
+ this.sendButton.Text = "Send";
+ this.sendButton.UseVisualStyleBackColor = true;
+ this.sendButton.Click += new System.EventHandler(this.sendButton_Click);
+ //
+ // commandText
+ //
+ this.commandText.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.commandText.Location = new System.Drawing.Point(3, 4);
+ this.commandText.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.commandText.Name = "commandText";
+ this.commandText.Size = new System.Drawing.Size(471, 23);
+ this.commandText.TabIndex = 0;
+ //
+ // printText
+ //
+ this.printText.BackColor = System.Drawing.Color.White;
+ this.printText.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.printText.Location = new System.Drawing.Point(3, 44);
+ this.printText.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.printText.Multiline = true;
+ this.printText.Name = "printText";
+ this.printText.ReadOnly = true;
+ this.printText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.printText.Size = new System.Drawing.Size(577, 591);
+ this.printText.TabIndex = 2;
+ this.printText.TabStop = false;
+ //
+ // portRefreshButton
+ //
+ this.portRefreshButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("portRefreshButton.BackgroundImage")));
+ this.portRefreshButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.portRefreshButton.Location = new System.Drawing.Point(159, 4);
+ this.portRefreshButton.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.portRefreshButton.Name = "portRefreshButton";
+ this.portRefreshButton.Size = new System.Drawing.Size(25, 24);
+ this.portRefreshButton.TabIndex = 2;
+ this.portRefreshButton.UseVisualStyleBackColor = true;
+ this.portRefreshButton.Click += new System.EventHandler(this.portRefreshButton_Click);
+ //
+ // SerialCommApp
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(583, 679);
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.Name = "SerialCommApp";
+ this.Text = "Serial Communication Application";
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.tableLayoutPanel3.ResumeLayout(false);
+ this.tableLayoutPanel3.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ private System.Windows.Forms.Button connectButton;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Button portRefreshButton;
+ private System.Windows.Forms.Button settingButton;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ComboBox portComboBox;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
+ private System.Windows.Forms.Button sendButton;
+ private System.Windows.Forms.TextBox commandText;
+ private System.Windows.Forms.TextBox printText;
+ }
+}
+
diff --git a/MySolution/SerialComApp/SerialCommApp.cs b/MySolution/SerialComApp/SerialCommApp.cs
new file mode 100644
index 0000000..61be7f6
--- /dev/null
+++ b/MySolution/SerialComApp/SerialCommApp.cs
@@ -0,0 +1,178 @@
+using SerialCommApp.Dialogs;
+using SerialCommApp.SeriallLibs;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace SerialCommApp
+{
+ public enum MessageType
+ {
+ SYS,
+ SND,
+ RCV,
+ }
+
+ public partial class SerialCommApp : Form
+ {
+ private PSerialComm _serial;
+ private PSerialCommSetting _serialSetting;
+
+
+ public SerialCommApp()
+ {
+ InitializeComponent();
+ InitInstance();
+
+ UIEnable(false);
+ }
+
+ private void InitInstance()
+ {
+ _serial = new PSerialComm();
+ _serialSetting = new PSerialCommSetting();
+
+ _serial.OnDataReceived += _serial_OnDataReceived;
+
+ GetPortNames();
+ }
+
+ private void GetPortNames()
+ {
+ DataTable portTable = new DataTable();
+ portTable.Columns.Add("VALUE", typeof(string));
+
+ string[] portNames = PSerialComm.GetPortNames();
+ if (portNames == null || portNames.Length < 1)
+ return;
+
+ foreach (string port in portNames)
+ {
+ portTable.Rows.Add(port);
+ }
+
+ portComboBox.DataSource = portTable.DefaultView;
+ portComboBox.ValueMember = "VALUE";
+ }
+
+ private void UIEnable(bool isConnect)
+ {
+ portComboBox.Enabled = !isConnect;
+ portRefreshButton.Enabled = !isConnect;
+ settingButton.Enabled = !isConnect;
+
+ sendButton.Enabled = isConnect;
+ }
+
+ private void PortOpen()
+ {
+ try
+ {
+ DataRowView rowView = portComboBox.SelectedItem as DataRowView;
+ if (rowView == null)
+ {
+ MessageBox.Show("Please check the selected port.");
+ return;
+ }
+
+ _serial.PortName = rowView.Row["VALUE"].ToString();
+ _serial.Open();
+
+ UIEnable(true);
+ connectButton.Text = "Disconnect";
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+ private void PortClose()
+ {
+ try
+ {
+ if (_serial.IsOpen)
+ _serial.Close();
+
+ UIEnable(false);
+ connectButton.Text = "Connect";
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+ private void portRefreshButton_Click(object sender, EventArgs e)
+ {
+ GetPortNames();
+ }
+
+ private void settingButton_Click(object sender, EventArgs e)
+ {
+ PSerialCommSetting setting = (PSerialCommSetting)_serialSetting.Clone();
+ CommSettingDialog dlg = new CommSettingDialog(setting);
+ if (dlg.ShowDialog() != DialogResult.OK)
+ return;
+
+ _serialSetting = dlg.Setting;
+ }
+
+ private void WriteLine(string message, MessageType type)
+ {
+ string text = $"[{DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")} : {type.ToString()}] {message}";
+ printText.AppendText(text + Environment.NewLine);
+ }
+
+ private void _serial_OnDataReceived(object sender, string e)
+ {
+ WriteLine(e, MessageType.RCV);
+ }
+
+ private void connectButton_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (portComboBox.SelectedIndex < 0)
+ {
+ MessageBox.Show("Please select port.");
+ return;
+ }
+
+ if (connectButton.Text == "Connect")
+ PortOpen();
+ else
+ PortClose();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ UIEnable(false);
+ }
+ }
+
+ private void sendButton_Click(object sender, EventArgs e)
+ {
+ string command = commandText.Text + "\r\n";
+
+ if (!_serial.IsOpen)
+ {
+ MessageBox.Show("포트가 열려있지 않습니다.");
+ return;
+ }
+
+ WriteLine(commandText.Text, MessageType.SND);
+
+ _serial.Write(command);
+
+ commandText.Clear();
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/SerialCommApp.csproj b/MySolution/SerialComApp/SerialCommApp.csproj
new file mode 100644
index 0000000..b614b66
--- /dev/null
+++ b/MySolution/SerialComApp/SerialCommApp.csproj
@@ -0,0 +1,95 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {21CB97AA-1550-4C56-894D-76E6B75B91DC}
+ WinExe
+ SerialCommApp
+ SerialCommApp
+ v4.5
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ CommSettingDialog.cs
+
+
+ Form
+
+
+ SerialCommApp.cs
+
+
+
+
+
+
+
+ CommSettingDialog.cs
+
+
+ SerialCommApp.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MySolution/SerialComApp/SerialCommApp.resx b/MySolution/SerialComApp/SerialCommApp.resx
new file mode 100644
index 0000000..09cdc5d
--- /dev/null
+++ b/MySolution/SerialComApp/SerialCommApp.resx
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ Yiq7Dov2LgAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/MySolution/SerialComApp/SeriallLibs/PMessageHistory.cs b/MySolution/SerialComApp/SeriallLibs/PMessageHistory.cs
new file mode 100644
index 0000000..1b73d83
--- /dev/null
+++ b/MySolution/SerialComApp/SeriallLibs/PMessageHistory.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SerialCommApp.SeriallLibs
+{
+ public class PMessageHistory
+ {
+ private List _messageList;
+ private int _size;
+
+ public PMessageHistory(int size)
+ {
+ _size = size;
+ _messageList = new List(_size);
+ }
+
+ public void Add(T message)
+ {
+ if (_messageList.Count == 0)
+ _messageList.Add(message);
+ else
+ _messageList.Insert(0, message);
+
+ if (_messageList.Count <= _size)
+ return;
+
+ while (_messageList.Count > _size)
+ {
+ _messageList.RemoveAt(_messageList.Count);
+ }
+ }
+
+ public T this[int index]
+ {
+ get { return _messageList[index]; }
+ }
+
+ public void Clear()
+ {
+ _messageList = new List(_size);
+ }
+
+ public int Count { get { return _messageList.Count; } }
+ }
+}
diff --git a/MySolution/SerialComApp/SeriallLibs/PSerialComm.cs b/MySolution/SerialComApp/SeriallLibs/PSerialComm.cs
new file mode 100644
index 0000000..12e9387
--- /dev/null
+++ b/MySolution/SerialComApp/SeriallLibs/PSerialComm.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SerialCommApp.SeriallLibs
+{
+ public class PSerialComm
+ {
+ private readonly string CRLF = "\r\n";
+
+ private SerialPort _serialPort;
+ private string _stringBuffer;
+
+ private object _receiveLock = new object();
+
+ public event EventHandler OnDataReceived;
+
+ public PMessageHistory History { get; set; }
+ public PSerialCommSetting SerialCommSetting { get; set; }
+
+ public bool IsOpen { get { return _serialPort.IsOpen; } }
+
+ public string PortName
+ {
+ get
+ {
+ return _serialPort.PortName;
+ }
+ set
+ {
+ _serialPort.PortName = value;
+ }
+ }
+
+ public PSerialComm()
+ {
+ InitInstance();
+ }
+
+ public PSerialComm(string port)
+ {
+ InitInstance();
+ this.PortName = port;
+ }
+
+ private void InitInstance()
+ {
+ if (_serialPort != null)
+ _serialPort.Close();
+
+ _serialPort = new SerialPort();
+ _serialPort.DataReceived += SerialPort_DataReceived;
+
+ SerialCommSetting = new PSerialCommSetting();
+
+ this.History = new PMessageHistory(10);
+ }
+
+ private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
+ {
+ SerialPort serialPort = sender as SerialPort;
+ if (serialPort == null)
+ return;
+
+ string data = serialPort.ReadExisting();
+ if (data.Length < 1)
+ return;
+
+ HandleData(data);
+ }
+
+ public static string[] GetPortNames()
+ {
+ return SerialPort.GetPortNames();
+ }
+
+ public void Write(string message)
+ {
+ _serialPort.Write(message);
+ }
+
+ private void HandleData(string data)
+ {
+ _stringBuffer = string.Concat(_stringBuffer, data);
+
+
+ if (this.OnDataReceived == null)
+ return;
+
+ while (true)
+ {
+ int subStringIdx = _stringBuffer.IndexOf(CRLF);
+ if (subStringIdx < 0)
+ break;
+
+ string message = _stringBuffer.Substring(0, subStringIdx);
+ History.Add(message);
+
+ if (this.OnDataReceived != null)
+ this.OnDataReceived(this, message);
+
+ _stringBuffer = _stringBuffer.Remove(0, subStringIdx + CRLF.Length);
+ }
+ }
+
+ public void Open()
+ {
+ if (string.IsNullOrEmpty(this.PortName))
+ throw new Exception("Port name is cannot be empty.");
+
+ if (!_serialPort.IsOpen)
+ _serialPort.Open();
+ }
+
+ public void Close()
+ {
+ if (string.IsNullOrEmpty(this.PortName))
+ throw new Exception("Port name is cannot be empty.");
+
+ if (_serialPort.IsOpen)
+ _serialPort.Close();
+ }
+ }
+}
diff --git a/MySolution/SerialComApp/SeriallLibs/PSerialCommSetting.cs b/MySolution/SerialComApp/SeriallLibs/PSerialCommSetting.cs
new file mode 100644
index 0000000..c55b995
--- /dev/null
+++ b/MySolution/SerialComApp/SeriallLibs/PSerialCommSetting.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SerialCommApp.SeriallLibs
+{
+ [DefaultProperty("Serial Communication")]
+ public class PSerialCommSetting : ICloneable
+ {
+ public enum PSerialBaudRate
+ {
+ B1200 = 1200,
+ B2400 = 2400,
+ B4800 = 4800,
+ B9600 = 9600,
+ B19200 = 19200,
+ B38400 = 38400,
+ B57600 = 57600,
+ B115200 = 115200,
+ }
+
+ public enum PSerailDataBit
+ {
+ D8 = 8,
+ D7 = 7,
+ }
+
+ [Category("Communication")]
+ public PSerialBaudRate BaudRate { get; set; }
+ [Category("Communication")]
+ public PSerailDataBit DataBit { get; set; }
+ [Category("Communication")]
+ public Parity Parity { get; set; }
+ [Category("Communication")]
+ public StopBits StopBits { get; set; }
+
+ public PSerialCommSetting(PSerialBaudRate baudRate = PSerialBaudRate.B9600, PSerailDataBit dataBit = PSerailDataBit.D8, Parity parity = Parity.None, StopBits stopBits = StopBits.None)
+ {
+ this.BaudRate = baudRate;
+ this.DataBit = dataBit;
+ this.Parity = parity;
+ this.StopBits = stopBits;
+ }
+
+ public object Clone()
+ {
+ PSerialCommSetting cloned = new PSerialCommSetting();
+ cloned.BaudRate = this.BaudRate;
+ cloned.DataBit = this.DataBit;
+ cloned.Parity = this.Parity;
+ cloned.StopBits = this.StopBits;
+
+ return cloned;
+ }
+ }
+}
diff --git a/Reaources/Refresh.ico b/Reaources/Refresh.ico
new file mode 100644
index 0000000..571e26f
Binary files /dev/null and b/Reaources/Refresh.ico differ
diff --git a/Reaources/Refresh_48px.png b/Reaources/Refresh_48px.png
new file mode 100644
index 0000000..ea4833c
Binary files /dev/null and b/Reaources/Refresh_48px.png differ
diff --git a/Reaources/SerialIcon.ico b/Reaources/SerialIcon.ico
new file mode 100644
index 0000000..10acb3d
Binary files /dev/null and b/Reaources/SerialIcon.ico differ