尊重原创 勿抄袭

勿私放其他平台

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控


WPF也是我今年刚开始深入去了解,看了不少的学习视频和书籍,受剑神Python入门到放弃的启发,想把这段时间学习内容做个总结,一是因为我相信技术总是需要不断的总结与练习才能有所进步,二是希望帮助初学者对WPF有个初步的了解,大家一起探讨学习进步。

说明:

本文主要介绍WPF(Windows Presentation Foundation),是微软推出的一项基于windows操作系统、.NET平台的C/S客户端构建技术。

软件下载地址:

​https://visualstudio.microsoft.com/zh-hans/vs/​ 

这里使用的是Visual Studio 2019 社区版


提示:

文章附带工具下载地址的获取,

请关注“剑指工控“微信公众号后,

添加管理员,

加入剑指工控微信群后获取。



第5讲串口的读取与写入 

首先添加一个串口类SerialCom

前面有讲过添加类,这里就不在赘述。


添加public  static 修饰

添加static修饰主要是无需创建类的实例就能够访问的类中的字段和方法。


需要引用System.IO.Ports     using System.IO.Ports;

 public static SerialPort com { get; set; } = new SerialPort(); 

创建串口对象字段

依次设置 串口号、波特率、数据位、停止位、校验位

 //串口名字
public static string com_name { get; set; }
// 波特率
public static int com_Bound { get; set; }
//数据位
public static int com_DataBit { get; set; }
// 校验位
public static string com_Verify { get; set; }
// 停止位
public static string com_StopBit { get; set; }
// 串口的打开状态标记位
public static bool OpenState { get; set; }
//数据显示
public static List<string> comdata = new List<string>();


WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控_02


建一个串口收发数据的类

public class MyCom{}

实现串口打开的方法:public void ComOpen() { }

判断串口是否已经打开  if(SerialCom.OpenState == false){}  

设置串口名、波特率、数据位、停止位、校验位。  

SerialCom.com.PortName = SerialCom.com_name;
SerialCom.com.BaudRate = SerialCom.com_Bound;
SerialCom.com.DataBits = SerialCom.com_DataBit;
if (SerialCom.com_StopBit == "1") SerialCom.com.StopBits = System.IO.Ports.StopBits.One;
if (SerialCom.com_StopBit == "2") SerialCom.com.StopBits = System.IO.Ports.StopBits.Two;
if (SerialCom.com_Verify == "None") SerialCom.com.Parity = System.IO.Ports.Parity.None;
if (SerialCom.com_Verify == "Odd") SerialCom.com.Parity = System.IO.Ports.Parity.Odd;
if (SerialCom.com_Verify == "Even") SerialCom.com.Parity = System.IO.Ports.Parity.Even;
SerialCom.com.NewLine= "\r\n"; 接收或者发送数据回车显示
Comthread(); 启动线程

否则的话 关闭串口,同时串口的状态为false。
SerialCom.comdata.Add("关闭串口");
SerialCom.com.Close();
SerialCom.OpenState = false;

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_串口_03


写一个读取串口的方法

private void ReadDada(){}

读取过程中串口一定是打开的,设置相应的状态

SerialCom.comdata.Add("打开串口完成");
SerialCom.OpenState = true;
  • 添加引用线程 using System.Threading;
  • Thread.Sleep(50); 延时50ms接收数据。
  • Try{} catch{}  代码放到try中,代码运行时会执行try中语句。如果没有异常,这些语句将执行下去,直到运行结束;如果一旦出现异常则跳出try,去执行catch中的内容。
  •  int n = SerialCom.com.BytesToRead; 查询串口中目前保存了多少数据
  • byte[] buf = new byte[n];SerialCom.com.Read(buf, 0, n);    读取串口数据
if (buf.Length > 0)  {
string str = Encoding.Default.GetString(buf);
SerialCom.comdata.Add(str);} 如果收到数据则输出
catch { SerialCom.OpenState = false; SerialCom.com.Close(); } 异常则关闭串口

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_04


写一个串口写数据的方法

public void WriteData(byte[] bytes){}
if (SerialCom.OpenState && bytes != null)
{
SerialCom.com.Write(bytes, 0, bytes.Length);
}

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_05


写一个线程读取串口数据的方法

private void Comthread()
{
SerialCom.com.Open();打开串口
SerialCom.com.Encoding = Encoding.GetEncoding("GB2312");设置编码格式
Thread thread = new Thread(ReadDada); 实例化一个线程
thread.IsBackground = true; 设置线程为后台线程
thread.Start(); 启动线程
}

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_串口_06


添加定时器所用的命名空间

  • using System.Windows.Threading;  
  • DispatcherTimer dtimer = new DispatcherTimer();实例化一个定时器
  • private MyCom mCom = new MyCom(); 实例化一个串口类

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_串口_07


在窗口加载事件中添加定时间隔/开启定时器

  • dtimer.Interval = TimeSpan.FromMilliseconds(100);  设置定时间隔为100ms
  •  dtimer.Tick += new EventHandler(timer_Tick);  注册定时中断事件
  •  dtimer.Start();           定时器开启

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_串口_08


添加按钮发送事件

private void Send_Click(object sender, RoutedEventArgs e)
{
mCom.WriteData(Encoding.UTF8.GetBytes(Senddata.Text));
}

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_09


添加按钮打开事件

private void Open_Click(object sender, RoutedEventArgs e)
{
SerialCom.com_name = Portname.Text; // 串口号
SerialCom.com_Bound = int.Parse(Baudrate.Text); // 波特率
SerialCom.com_DataBit = int.Parse(Databit.Text); // 数据位
SerialCom.com_StopBit = Stopbit.Text;// 停止位
SerialCom.com_Verify = Parity.Text;// 校验位
mCom.ComOpen();
}

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_10



代码部分完成


启动运行显示如下错误:  

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控_11


需要通过nuget 安装System.Text.Encoding.CodePages

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控_12


同时我们需要对引用的编码使用 Encoding.RegisterProvider 函数进行注册

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_串口_13


网上下载一个串口调试助手(找剑指工控管理员获取下载地址哦!WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_14,设置相同的波特率、数据位、停止位、校验位。一个发送,一个接收效果如下:

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_数据_15



WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控

串口调试助手基本完成,下期主要优化一些界面以及发布以便在没有安装.Net5的环境下也能运行。

尽管 .NET 是一种跨平台技术,但 WPF 并不是,它仅在 Windows 上运行。

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控


就这么简单!下周见!


作者简介:

曹言林:加入工控七余载,从事过单片机编程、控制柜接线、设备维修,PLC编程、MES实施,目前主要做MES售前,对各方面虽不是专家级别,也愿为工控圈添砖加瓦,贡献自己的一份力量。


more+

WPF入门到放弃(五)| 串口的读取与写入(程序&附串口调试精灵)_工控_18