C# 串口编程 — MVVM MVVM Light 实例
生活随笔
收集整理的這篇文章主要介紹了
C# 串口编程 — MVVM MVVM Light 实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近在學習WPF的MVVM模式,在公司用的串口調(diào)試工具太大(主要功能太強大,有很多其他功能,但是我用不到),所以閑著沒事,自己寫了一個串口調(diào)試工具,還是使用的WPF的MVVM模式,發(fā)現(xiàn)自從對它有些了解后,我已經(jīng)迷上了這種模式
主要:下拉框加載本地所有串口,綠色代表串口已經(jīng)連接,輸入信息后,點發(fā)送信息,就會按發(fā)送頻率對串口循環(huán)發(fā)送
<Grid><Grid.RowDefinitions><RowDefinition Height="212*" /><RowDefinition Height="32*" /><RowDefinition Height="37*" /></Grid.RowDefinitions><Label Content="本地串口" Grid.Row="2" Height="28" HorizontalAlignment="Left" Margin="7,6,0,0" Name="label1" VerticalAlignment="Top" /><ComboBox ItemsSource="{Binding Coms}" SelectedValue="{Binding CurrentPortName}" DisplayMemberPath="" Height="23" HorizontalAlignment="Left" Margin="71,6,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" Grid.Row="2" /><Button Content="打開串口" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="261,6,0,0" Name="button1" VerticalAlignment="Top" Width="75" Command="{Binding OpenPort}" /><Rectangle Height="17" RadiusX="6" RadiusY="6" HorizontalAlignment="Left" Margin="220,9,0,0" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="17" Grid.Row="2" Fill="{Binding ValueColor}" /><Label Content="信息" Height="28" HorizontalAlignment="Left" Margin="25,14,0,0" Name="label2" VerticalAlignment="Top" /><TextBox Text="{Binding Msg1,Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="98,16,0,0" Name="textBox1" VerticalAlignment="Top" Width="290" /><Button Content="{Binding BtnName}" Height="23" Command="{Binding SendMsg}" HorizontalAlignment="Left" Margin="362,6,0,0" Name="button2" VerticalAlignment="Top" Width="84" Grid.Row="2" /><Label Content="信息" Height="28" HorizontalAlignment="Left" Margin="25,51,0,0" Name="label3" VerticalAlignment="Top" /><TextBox Text="{Binding Msg2,Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="98,53,0,0" Name="textBox2" VerticalAlignment="Top" Width="290" /><Label Content="信息" Height="28" HorizontalAlignment="Left" Margin="25,93,0,0" Name="label4" VerticalAlignment="Top" /><TextBox Text="{Binding Msg3,Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="98,95,0,0" Name="textBox3" VerticalAlignment="Top" Width="290" /><Label Content="信息" Height="28" HorizontalAlignment="Left" Margin="25,133,0,0" Name="label5" VerticalAlignment="Top" /><TextBox Text="{Binding Msg4,Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="98,135,0,0" Name="textBox4" VerticalAlignment="Top" Width="290" /><Label Content="信息" Height="28" HorizontalAlignment="Left" Margin="25,167,0,0" Name="label6" VerticalAlignment="Top" /><TextBox Text="{Binding Msg5,Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="98,169,0,0" Name="textBox5" VerticalAlignment="Top" Width="290" /><CheckBox Content="重復發(fā)送" IsChecked="{Binding IsFor}" Grid.Row="1" Height="16" HorizontalAlignment="Left" Margin="373,7,0,0" Name="checkBox1" VerticalAlignment="Top" /><Label Content="發(fā)送頻率" Height="28" HorizontalAlignment="Left" Margin="220,4,0,0" Name="label7" VerticalAlignment="Top" Grid.Row="1" /><TextBox Text="{Binding PL, Mode=TwoWay}" Height="23" HorizontalAlignment="Left" Margin="284,4,0,0" Name="textBox6" VerticalAlignment="Top" Width="67" Grid.Row="1" /></Grid> 前臺頁面 public partial class MainWindow : Window{MainViewModel viewmodel;public MainWindow(){InitializeComponent();viewmodel = new MainViewModel();this.DataContext = viewmodel;} } 后臺代碼?
public class MainViewModel : ViewModelBase{/// <summary>/// Initializes a new instance of the MainViewModel class./// </summary>public MainViewModel(){Cominit();//初始化端口this.OpenPort = new RelayCommand(OpenportAction);SendMsg = new RelayCommand(Sendmessage);}#region 屬性private string currentPortName;/// <summary>/// 當前端口名稱/// </summary>public string CurrentPortName{get { return currentPortName; }set{if (this.CurrenPort != null){if (this.CurrenPort.IsOpen){this.CurrenPort.Close();}}currentPortName = value;RaisePropertyChanged("CurrentPortName");this.CurrenPort = new SerialPort();this.ValueColor = "Red";}}private string valueColor = "Red";/// <summary>/// 狀態(tài)顯示顏色/// </summary>public string ValueColor{get { return valueColor; }set{valueColor = value;RaisePropertyChanged("ValueColor");}}private ObservableCollection<string> coms;/// <summary>/// com端口集合/// </summary> public ObservableCollection<string> Coms{get { return coms; }set{coms = value;RaisePropertyChanged("Coms");}}private SerialPort port;/// <summary>/// 當前操作端口/// </summary>public SerialPort CurrenPort{get { return port; }set { port = value; }}private string msg1;/// <summary>/// 消息1/// </summary>public string Msg1{get { return msg1; }set{msg1 = value;RaisePropertyChanged("Msg1");}}private string msg2;/// <summary>/// 消息2/// </summary>public string Msg2{get { return msg2; }set{msg2 = value;RaisePropertyChanged("Msg2");}}private string msg3;/// <summary>/// 消息3/// </summary>public string Msg3{get { return msg3; }set{msg3 = value;RaisePropertyChanged("Msg3");}}private string msg4;/// <summary>/// 消息4/// </summary>public string Msg4{get { return msg4; }set{msg4 = value;RaisePropertyChanged("Msg4");}}private string msg5;/// <summary>/// 消息5/// </summary>public string Msg5{get { return msg5; }set{msg5 = value;RaisePropertyChanged("Msg5");}}private bool isFor = false;/// <summary>/// 是否循環(huán)發(fā)送/// </summary>public bool IsFor{get { return isFor; }set{isFor = value;RaisePropertyChanged("IsFor");}}private string btnName = "發(fā)送信息";/// <summary>/// 按鈕名稱: 發(fā)送信息 : 停止發(fā)送/// </summary>public string BtnName{get { return btnName; }set{btnName = value;RaisePropertyChanged("BtnName");}}private int pl = 500;/// <summary>/// 發(fā)送頻率/// </summary>public int PL{get { return pl; }set{pl = value;RaisePropertyChanged("PL"); }}#endregion/// <summary>/// 打開端口命令/// </summary>public RelayCommand OpenPort { get; set; }/// <summary>/// 發(fā)送信息命令/// </summary>public RelayCommand SendMsg { get; set; }/// <summary>/// 打開端口/// </summary>public void OpenportAction(){try{if (CurrenPort != null && CurrenPort.PortName == CurrentPortName && CurrenPort.IsOpen){return;}this.CurrenPort = new SerialPort();CurrenPort.PortName = CurrentPortName;this.CurrenPort.Open();this.ValueColor = "Lime";}catch (System.Exception ex){this.ValueColor = "Red";}}/// <summary>/// 初始化端口/// </summary>public void Cominit(){Coms = new ObservableCollection<string>();Microsoft.VisualBasic.Devices.Computer computer = new Microsoft.VisualBasic.Devices.Computer();Coms.Add("虛擬端口");foreach (string str in computer.Ports.SerialPortNames){Coms.Add(str);}}List<string> msgs;// 消息列表bool isopen = false;// 標記按鈕當前狀態(tài)Thread thread; //線程實例public void Sendmessage(){if (!isopen){isopen = true;BtnName = "停止發(fā)送";msgs = new List<string>();if (!string.IsNullOrEmpty(Msg1)){msgs.Add(Msg1);}if (!string.IsNullOrEmpty(Msg2)){msgs.Add(Msg2);}if (!string.IsNullOrEmpty(Msg3)){msgs.Add(Msg3);}if (!string.IsNullOrEmpty(Msg4)){msgs.Add(Msg4);}if (!string.IsNullOrEmpty(Msg5)){msgs.Add(Msg5);}thread = new Thread(new ThreadStart(ThreadSend));thread.Start();}else{thread.Abort();isopen = false;BtnName = "發(fā)送信息";}}public void ThreadSend(){bool value = true;while (value){foreach (string str in msgs){Thread.Sleep(PL); // 發(fā)送頻率 線程掛起 CurrenPort.WriteLine(str);}if (!IsFor)//是否循環(huán)發(fā)送 {value = false;}}isopen = false;BtnName = "發(fā)送信息";thread.Abort();}} MainViewModel?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yuanaibeilei/p/3286479.html
總結(jié)
以上是生活随笔為你收集整理的C# 串口编程 — MVVM MVVM Light 实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codility上的问题(26) Hyd
- 下一篇: 简单的 基于seajs一个base基础库