做企业形象网站,linux 网站建设,文化集团网站模板,阿里云域名注册查询一、引言
在现代工业控制、嵌入式系统等领域#xff0c;串口通信作为一种常见的通信方式#xff0c;被广泛应用于各种场景。C#作为一门强大的编程语言#xff0c;结合Windows Presentation Foundation#xff08;WPF#xff09;框架#xff0c;可以轻松实现串口通信功能…
一、引言
在现代工业控制、嵌入式系统等领域串口通信作为一种常见的通信方式被广泛应用于各种场景。C#作为一门强大的编程语言结合Windows Presentation FoundationWPF框架可以轻松实现串口通信功能。本文将带领大家一步步实现C# WPF串口通信并在控制台打印接收到的数据。
二、环境准备
在开始编写代码之前请确保您的开发环境满足以下条件
安装Visual Studio 2019或更高版本。创建一个WPF应用程序项目。
三、实现步骤
1.初始化串口
首先我们需要创建一个SerialPort对象并对其进行配置。以下是一个初始化串口的示例方法
public bool InitCOM(string PortName)
{serialPort new SerialPort(PortName, 115200, Parity.None, 8, StopBits.One);serialPort.DataReceived new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.ReceivedBytesThreshold 1;serialPort.RtsEnable true;return OpenPort();
}在这段代码中我们设置了串口的名称、波特率、校验位、数据位和停止位。同时我们为serialPort对象订阅了DataReceived事件以便在接收到数据时进行处理。
2.打开串口
接下来我们需要编写一个方法来打开串口。以下是一个打开串口的示例方法
public bool OpenPort()
{try{serialPort.Open();}catch (Exception ex){MessageBox.Show($无法打开串口: {ex.Message});return false;}return serialPort.IsOpen;
}在这段代码中我们尝试打开串口并在打开失败时捕获异常显示错误信息。
3.接收数据并打印到控制台
当串口接收到数据时会触发DataReceived事件。我们可以在事件处理程序中读取数据并将其打印到控制台。以下是一个处理数据接收的示例方法
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{int bytesToRead serialPort.BytesToRead;byte[] readBuffer new byte[bytesToRead];serialPort.Read(readBuffer, 0, bytesToRead);string str Encoding.Default.GetString(readBuffer);Dispatcher.Invoke(() {MessageBox.Show(str);});Console.WriteLine(str);
}在这段代码中我们首先读取串口缓冲区中的数据然后将其转换为字符串。接着我们在UI线程上显示一个消息框并在控制台上打印接收到的数据。
4.发送数据
最后我们来实现发送数据的功能。以下是一个发送数据的示例方法
public void SendCommand(string CommandString)
{if (serialPort ! null serialPort.IsOpen){byte[] WriteBuffer Encoding.ASCII.GetBytes(CommandString);serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);}else{MessageBox.Show(串口未打开无法发送数据。);}
}在这段代码中我们首先检查串口是否已打开然后发送指定的字符串。
四、总结
通过本文我们介绍了如何在C# WPF应用程序中实现串口通信包括初始化串口、打开串口、接收数据、发送数据以及在控制台打印接收到的数据。掌握这些基本技巧将为您的WPF串口通信项目开发带来极大便利。在实际应用中您可以根据需求对代码进行优化和扩展以满足更复杂的功能需求。 界面还在编写中。。。。。
最终代码 using System;
using System.IO.Ports;
using System.Text;
using System.Windows;
//必要的库public SerialPort serialPort { get; set; }public MainWindow(){InitializeComponent();if (InitCOM(COM9)){Console.WriteLine(Hello, World!);SendCommand(asdasdasd); // 发送字符}}public bool InitCOM(string PortName){serialPort new SerialPort(PortName, 115200, Parity.None, 8, StopBits.One);serialPort.DataReceived new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.ReceivedBytesThreshold 1;serialPort.RtsEnable true;return OpenPort();}private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){int bytesToRead serialPort.BytesToRead; // 获取实际可读的字节数byte[] readBuffer new byte[bytesToRead]; // 根据实际可读的字节数分配缓冲区serialPort.Read(readBuffer, 0, bytesToRead); // 读取数据string str Encoding.Default.GetString(readBuffer); // 将字节数组转换为字符串// 在UI线程上显示消息框Dispatcher.Invoke(() {MessageBox.Show(str);});Console.WriteLine(str); // 打印到控制台}public bool OpenPort(){try{serialPort.Open();}catch (Exception ex){MessageBox.Show($无法打开串口: {ex.Message});return false;}return serialPort.IsOpen;}public void SendCommand(string CommandString){if (serialPort ! null serialPort.IsOpen){byte[] WriteBuffer Encoding.ASCII.GetBytes(CommandString);serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);}else{MessageBox.Show(串口未打开无法发送数据。);}}// 在窗口关闭时确保串口被关闭protected override void OnClosed(EventArgs e){base.OnClosed(e);if (serialPort ! null serialPort.IsOpen){serialPort.Close();}}