C# 串口编程 — MVVM MVVM Light 实例
最近在学习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 实例相关推荐
- MFC 串口编程实例
MFC 串口编程实例 VC串口编程从实现方法上一般分为两种,一种使用MSCOMM控件,这种方法比较简单,软件的移植性较低,在这里介绍一种串口封装类的使用方法. 代码 先看代码 CommUtils.cp ...
- QT开发(五十)——QT串口编程基础
QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要 ...
- Linux串口编程_termios
1.1 Linux串口编程主要是设置structtermios结构体的个成员值.Termios是在POSIX规范中定义的标准接口,表示终端设备(包括虚拟终端丶串口等),串口是一种终端设备,一般通过终端 ...
- Win32 API串口编程
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...
- 深入浅出VC++串口编程--短信应用开发
前面数次连载我们以较长的篇幅讲解了串口通信的硬件原理.DOS平台控制以及基于WIN32 API.控件和第三方类的串口编程.作为本系列文章的最后一次连载,本章将给出一个典型的应用实例:西门子短信服务模块 ...
- 深入浅出VC++串口编程--第三方类
串口类 从本系列文章连载三.四可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出On ...
- 深入浅出VC++串口编程--基于控件
深入浅出VC++串口编程之基于控件源代码下载 MSComm控件 Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSCo ...
- 深入浅出VC++串口编程--基本概念
引言 在PC机的主板上,有一种类型的接口可能为我们所忽视,那就是RS-232C串行接口,在微软的Windows系统中称其为COM.我们可以通过设备管理器来查看COM的硬件参数设置,如图1. 图1 在W ...
- 基于MODBUS-RTU协议的串口编程
首先给大家描述一下当前样例串口编程的场景,使用一个水位传感器来测试水库水位的高度,水位传感器连接数据采集器,数据采集器通过485串口和USB口转换器和电脑连接,电脑程序通过USB口读取水位传感器上传到 ...
- linux下的串口编程
本文转自:http://www.cnblogs.com/jason-lu/articles/3173988.html 做人个人学习使用,绝无侵权之意.如果侵权,请尽快联系,谢谢. Linux下串口编程 ...
最新文章
- matlab中find函数的使用说明
- js array push 添加内容
- 【生成模型】解读显式生成模型之完全可见置信网络FVBN
- 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
- 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
- ASP.NET控件开发基础5
- 关于一个js栈溢出的异常
- 使用split_size优化的ODPS SQL的场景
- 【OpenCV】OpenCV函数精讲之 -- copyTo()函数及Mask详解(附代码详解)
- SecureCRT 完美代替超级终端
- SQL列转行问题(踩雷)
- Android应用帧率--FPS测试
- 假定一种编码的编码范围是a~y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,baa,baaa,b
- Go解决报错 error obtaining VCS status: exit status 128 Use -buildvcs=false to disable VCS stamping
- 用office toll plus 安装office2019 vol版
- 推土机(快排)荷兰国旗思路
- 2020 CUMCM全国大学生数学建模竞赛 A题 Notes
- First love
- Browser speed discrepancies
- macOS Ventura 正式版你确定不更新,好用到爆的功能你不想尝试一下?