最近在学习WPF的MVVM模式,在公司用的串口调试工具太大(主要功能太强大,有很多其他功能,但是我用不到),所以闲着没事,自己写了一个串口调试工具,还是使用的WPF的MVVM模式,发现自从对它有些了解后,我已经迷上了这种模式

主要:下拉框加载本地所有串口,绿色代表串口已经连接,输入信息后,点发送信息,就会按发送频率对串口循环发送

 <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="重复发送" IsChecked="{Binding IsFor}"  Grid.Row="1" Height="16" HorizontalAlignment="Left" Margin="373,7,0,0" Name="checkBox1" VerticalAlignment="Top" /><Label Content="发送频率" 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>/// 状态显示颜色/// </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>/// 是否循环发送/// </summary>public bool IsFor{get { return isFor; }set{isFor = value;RaisePropertyChanged("IsFor");}}private string btnName = "发送信息";/// <summary>/// 按钮名称: 发送信息 : 停止发送/// </summary>public string BtnName{get { return btnName; }set{btnName = value;RaisePropertyChanged("BtnName");}}private int pl = 500;/// <summary>/// 发送频率/// </summary>public int PL{get { return pl; }set{pl = value;RaisePropertyChanged("PL"); }}#endregion/// <summary>/// 打开端口命令/// </summary>public RelayCommand OpenPort { get; set; }/// <summary>/// 发送信息命令/// </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;// 标记按钮当前状态Thread thread; //线程实例public void Sendmessage(){if (!isopen){isopen = true;BtnName = "停止发送";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 = "发送信息";}}public void ThreadSend(){bool value = true;while (value){foreach (string str in msgs){Thread.Sleep(PL); // 发送频率  线程挂起
                    CurrenPort.WriteLine(str);}if (!IsFor)//是否循环发送
                {value = false;}}isopen = false;BtnName = "发送信息";thread.Abort();}}

MainViewModel

转载于:https://www.cnblogs.com/yuanaibeilei/p/3286479.html

C# 串口编程 — MVVM MVVM Light 实例相关推荐

  1. MFC 串口编程实例

    MFC 串口编程实例 VC串口编程从实现方法上一般分为两种,一种使用MSCOMM控件,这种方法比较简单,软件的移植性较低,在这里介绍一种串口封装类的使用方法. 代码 先看代码 CommUtils.cp ...

  2. QT开发(五十)——QT串口编程基础

    QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要 ...

  3. Linux串口编程_termios

    1.1 Linux串口编程主要是设置structtermios结构体的个成员值.Termios是在POSIX规范中定义的标准接口,表示终端设备(包括虚拟终端丶串口等),串口是一种终端设备,一般通过终端 ...

  4. Win32 API串口编程

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  5. 深入浅出VC++串口编程--短信应用开发

    前面数次连载我们以较长的篇幅讲解了串口通信的硬件原理.DOS平台控制以及基于WIN32 API.控件和第三方类的串口编程.作为本系列文章的最后一次连载,本章将给出一个典型的应用实例:西门子短信服务模块 ...

  6. 深入浅出VC++串口编程--第三方类

    串口类 从本系列文章连载三.四可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出On ...

  7. 深入浅出VC++串口编程--基于控件

    深入浅出VC++串口编程之基于控件源代码下载 MSComm控件 Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSCo ...

  8. 深入浅出VC++串口编程--基本概念

    引言 在PC机的主板上,有一种类型的接口可能为我们所忽视,那就是RS-232C串行接口,在微软的Windows系统中称其为COM.我们可以通过设备管理器来查看COM的硬件参数设置,如图1. 图1 在W ...

  9. 基于MODBUS-RTU协议的串口编程

    首先给大家描述一下当前样例串口编程的场景,使用一个水位传感器来测试水库水位的高度,水位传感器连接数据采集器,数据采集器通过485串口和USB口转换器和电脑连接,电脑程序通过USB口读取水位传感器上传到 ...

  10. linux下的串口编程

    本文转自:http://www.cnblogs.com/jason-lu/articles/3173988.html 做人个人学习使用,绝无侵权之意.如果侵权,请尽快联系,谢谢. Linux下串口编程 ...

最新文章

  1. matlab中find函数的使用说明
  2. js array push 添加内容
  3. 【生成模型】解读显式生成模型之完全可见置信网络FVBN
  4. 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
  5. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
  6. ASP.NET控件开发基础5
  7. 关于一个js栈溢出的异常
  8. 使用split_size优化的ODPS SQL的场景
  9. 【OpenCV】OpenCV函数精讲之 -- copyTo()函数及Mask详解(附代码详解)
  10. SecureCRT 完美代替超级终端
  11. SQL列转行问题(踩雷)
  12. Android应用帧率--FPS测试
  13. 假定一种编码的编码范围是a~y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,baa,baaa,b
  14. Go解决报错 error obtaining VCS status: exit status 128 Use -buildvcs=false to disable VCS stamping
  15. 用office toll plus 安装office2019 vol版
  16. 推土机(快排)荷兰国旗思路
  17. 2020 CUMCM全国大学生数学建模竞赛 A题 Notes
  18. First love
  19. Browser speed discrepancies
  20. macOS Ventura 正式版你确定不更新,好用到爆的功能你不想尝试一下?

热门文章

  1. ARM函数调用时参数传递规则
  2. supesite之空间篇
  3. asp.net 子页面调用外部 js
  4. C 实现Mysql增量备份_window下mysql数据库增量备份实现教程
  5. leetcode算法题--最长的斐波那契子序列的长度
  6. 整理:各个浏览器及web服务器对URL(get)长度的限制
  7. 如何获得Java中泛型类的类型参数?
  8. HtmlWebpackPlugin实现资源的自定义插入
  9. 联想家庭云中心:天边飘来“故乡的云”
  10. 烂泥:纠结一天的zencart网站问题,终于解决了