【WPF开发】上位机开发-串口收发

一、引言

在现代工业控制、嵌入式系统等领域,串口通信作为一种常见的通信方式,被广泛应用于各种场景。C#作为一门强大的编程语言,结合Windows Presentation Foundation(WPF)框架,可以轻松实现串口通信功能。本文将带领大家一步步实现C# WPF串口通信,并在控制台打印接收到的数据。

二、环境准备

在开始编写代码之前,请确保您的开发环境满足以下条件:

  1. 安装Visual Studio 2019或更高版本。
  2. 创建一个WPF应用程序项目。

三、实现步骤

1.初始化串口

首先,我们需要创建一个SerialPort对象,并对其进行配置。以下是一个初始化串口的示例方法:

cs 复制代码
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.打开串口

接下来,我们需要编写一个方法来打开串口。以下是一个打开串口的示例方法:

cs 复制代码
public bool OpenPort()
{
    try
    {
        serialPort.Open();
    }
    catch (Exception ex)
    {
        MessageBox.Show($"无法打开串口: {ex.Message}");
        return false;
    }

    return serialPort.IsOpen;
}

在这段代码中,我们尝试打开串口,并在打开失败时捕获异常,显示错误信息。

3.接收数据并打印到控制台

当串口接收到数据时,会触发DataReceived事件。我们可以在事件处理程序中读取数据,并将其打印到控制台。以下是一个处理数据接收的示例方法:

cs 复制代码
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.发送数据

最后,我们来实现发送数据的功能。以下是一个发送数据的示例方法:

cs 复制代码
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串口通信项目开发带来极大便利。在实际应用中,您可以根据需求对代码进行优化和扩展,以满足更复杂的功能需求。

界面还在编写中。。。。。

最终代码:

cs 复制代码
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();
            }
        }
相关推荐
cxks-从新开始14 分钟前
使用 md-editor-v3 开发自定义 Markdown 编辑器组件
编辑器
DdddJMs__13515 分钟前
C语言 | Leetcode C语言题解之第552题学生出勤记录II
c语言·leetcode·题解
DdddJMs__13519 分钟前
C语言 | Leetcode C语言题解之第554题砖墙
c语言·leetcode·题解
YuCaiH1 小时前
【STM32】USART串口数据包
笔记·stm32·单片机·嵌入式硬件
牙买加_小杨1 小时前
用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能
ide·vscode·编辑器
南郁1 小时前
06.VSCODE:备战大项目,CMake专项配置
ide·vscode·编辑器
爱编程— 的小李3 小时前
结构体(c语言)
c语言·开发语言
Kasen's experience3 小时前
STM32 GPIO 配置
stm32·单片机·嵌入式硬件
知行电子-3 小时前
Proteus中数码管动态扫描显示不全(已解决)
单片机·proteus·嵌入式
学习路上_write4 小时前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程