返回顶部
首页 > 资讯 > 精选 >基于WPF怎么编写一个串口转UDP工具
  • 898
分享到

基于WPF怎么编写一个串口转UDP工具

2023-07-05 20:07:22 898人浏览 泡泡鱼
摘要

这篇“基于WPF怎么编写一个串口转UDP工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于WPF怎么编写一个串口转UDP

这篇“基于WPF怎么编写一个串口转UDP工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于WPF怎么编写一个串口转UDP工具”文章吧。

框架准备

尽管希望做一个转发工具,但如果自身不会发送的话,那还得再用其他软件进行测试,所以这个转发工具,理应具备串口和UDP协议的全部功能,这一点也要在界面上体现出来。

新建一个WPF项目,名字是portUDP,然后开始布局,结果如下

基于WPF怎么编写一个串口转UDP工具

其中,串口设置中包含波特率、数据位、停止位和奇偶校验等信息,由于不常更换,所以隐藏起来。

串口只需要一个,但UDP通信需要设置本机和目标的IP地址与端口。自动转发单选框选中后,会自动将接收到的串口数据转给UDP,并且UDP收到的数据也会转给串口。

窗口尺寸为320 × 640 320\times640320×640,外部采用一个DockPanel,并对常用控件进行基本的外观设置

<DockPanel.Resources>    <Style TargetType="TextBox">        <Setter Property="VerticalAlignment" Value="Center"/>        <Setter Property="Margin" Value="2"/>    </Style>    <Style TargetType="TextBlock">        <Setter Property="VerticalAlignment" Value="Center"/>        <Setter Property="HorizontalAlignment" Value="Center"/>    </Style>    <Style TargetType="ComboBox">        <Setter Property="VerticalAlignment" Value="Center"/>        <Setter Property="Margin" Value="2"/>    </Style>    <Style TargetType="Button">        <Setter Property="VerticalAlignment" Value="Center"/>        <Setter Property="Margin" Value="2"/>    </Style>    <Style TargetType="CheckBox">        <Setter Property="VerticalAlignment" Value="Center"/>        <Setter Property="HorizontalAlignment" Value="Center"/>        <Setter Property="Margin" Value="2"/>    </Style></DockPanel.Resources>

左侧控制面板被写在一个StackPanel中,最上面是一个Expander,里面包含串口设置的相关信息

<Expander Header="串口设置">    <UnifORMGrid Columns="2" Visibility="Visible">        <TextBlock Text="波特率"/>        <ComboBox x:Name="cbBaud"/>        <TextBlock Text="数据位"/>        <ComboBox x:Name="cbDataBit"/>        <TextBlock Text="停止位"/>        <ComboBox x:Name="cbStopBit"/>        <TextBlock Text="校验位"/>        <ComboBox x:Name="cbParity"/>    </UniformGrid>    </Expander>

然后是一个GroupBox,用于进行基本设置,其中两个按钮需要在连接后更改内容,所以设了个名字。

<UniformGrid Columns="2">    <ComboBox x:Name="cbPorts" Margin="2"/>    <Button x:Name="btnPort" Content="连接串口"/>    <TextBox x:Name="txtSrcIP" Text="127.0.0.1"/>    <TextBox x:Name="txtSrcPort" Text="91"/>        <TextBox x:Name="txtDstIP" Text="127.0.0.1"/>    <TextBox x:Name="txtDstPort" Text="91"/>        <CheckBox Content="自动转发" IsChecked="True"/>    <Button  x:Name="btnUDP" Content="创建服务"/></UniformGrid>

最后是发送文本框与发送按钮等,内容如下

<TextBox x:Name="txtSend" TextWrapping="Wrap" Height="70"/><UniformGrid Columns="3">    <CheckBox Content="Hex" IsChecked="False"/>    <Button Content="串口发送"/>    <Button Content="UDP发送"/>    <CheckBox Content="时间"/>    <Button Content="清空日志"/>    <Button Content="保存日志"/></UniformGrid>

左侧控制界面布局完成后,是右侧的接收区域,内容如下

<GroupBox Header="日志信息">    <TextBox x:Name="txtInfo"  Height="270"/></GroupBox>

初始化

由于.net6.0不内置串口库,所以需要额外下载,点击菜单栏工具->NuGet包管理器->管理解决方案的NuGet包,点击浏览选项卡,搜索Ports,选择System.io.Ports,安装。

在对用户界面进行最简单的布局后,可以在C#代码中,对一些ComboBox做进一步的设置。

public void initComContent(){    // 串口号    cbPorts.ItemsSource = SerialPort.GetPortNames();    cbPorts.SelectedIndex = 0;        // 波特率    cbBaud.ItemsSource = new int[] { 9600, 19200, 38400, 115200 };    cbBaud.SelectedIndex = 3;    // 数据位    cbDataBit.ItemsSource = Enumerable.Range(1, 8);    cbDataBit.SelectedIndex = 7;        // 校验位    cbParity.ItemsSource = Enum.GetNames(typeof(Parity));    cbParity.SelectedIndex = 0;        //停止位    cbStopBit.ItemsSource = Enum.GetNames(typeof(StopBits));    cbStopBit.SelectedIndex = 1;}

这样,在打开软件之后,串口设置如下

基于WPF怎么编写一个串口转UDP工具

串口设置

接下来设置串口,在xml编辑界面,将btnPort后面添加Click="btnPort_Click"后,按下F12,IDE会自动创建对应的函数。

<Button x:Name="btnPort" Content="连接串口" Click="btnPort_Click"/>

在写串口开关按钮的控制指令之前,先新建一个全局的串口对象,然后写btnPort_Click内容

SerialPort sp;private void btnPort_Click(object sender, RoutedEventArgs e){    if (btnPort.Content.ToString() == "打开串口")    {        string name = cbPorts.SelectedItem.ToString();        try        {            sp = new SerialPort(name,                (int)cbBaud.SelectedItem,                (Parity)cbParity.SelectedIndex,                (int)cbDataBit.SelectedItem,                (StopBits)cbStopBit.SelectedIndex);            sp.Open();            sp.DataReceived += Sp_DataReceived;            txtInfo.AppendText($"串口{name}打开成功");        }        catch(Exception ex)        {            txtInfo.AppendText($"串口{name}打开失败,原因是{ex}");        }    }    else    {        try        {            sp.Close();            initComContent();        }        catch (Exception ex)        {            txtInfo.AppendText($"串口关闭失败,原因是{ex}");        }    }    btnPort.Content = sp.IsOpen ? "关闭串口" : "打开串口";}

其中sp.DataReceived += Sp_DataReceived;新增一个委托,用于规范串口接收到数据后的行为。

UDP设置

和串口设置相同,UDP也需要新建用于UDP通信的全局变量,包括本机节点、目标节点以及UDP服务。

UdpClient udp;
IPEndPoint ptSrc;
IPEndPoint ptDst;

然后设置创建服务按钮后,其逻辑与串口是相似的,都是在创建或关闭服务时,用try-catch语句以找到错误。

private void btnUDP_Click(object sender, RoutedEventArgs e){    if (btnUDP.Content.ToString() == "创建服务")    {        try        {            ptSrc = new IPEndPoint(IPAddress.Parse(txtSrcIP.Text), int.Parse(txtSrcPort.Text));            ptDst = new IPEndPoint(IPAddress.Parse(txtDstIP.Text), int.Parse(txtDstPort.Text));            udp = new UdpClient(ptSrc);            txtInfo.AppendText("成功创建服务");            btnUDP.Content = "关闭服务";        }catch(Exception ex)        {            txtInfo.AppendText($"服务创建失败,原因为{ex}\n");        }    }    else    {        try        {            udp.Close();            btnUDP.Content = "创建服务";        }        catch(Exception ex)        {            txtInfo.AppendText($"服务关闭失败,原因为{ex}");        }    }}

发送设置

首先是串口发送,在xaml文件中,为串口发送按钮挂载一个Click动作,其内容即为串口发送功能

<Button Content="串口发送" Click="btnPortSend_Click"/>
private void btnPortSend_Click(object sender, RoutedEventArgs e){    var data = Encoding.UTF8.GetBytes(txtSend.Text);    txtInfo.AppendText($"串口发送{txtSend.Text}\n");    sp.Write(data, 0, data.Length);}

然后是UDP发送,其改装过程也大同小异

<Button Content="UDP发送" Click="btnUDPSend_Click"/>
private void btnUDPSend_Click(object sender, RoutedEventArgs e){    var data = Encoding.UTF8.GetBytes(txtSend.Text);    txtInfo.AppendText($"UDP发送{txtSend.Text}\n");    udp.Send(data, data.Length, ptDst);    //将内容发给ptDst}

转发设置

转发是本软件的核心功能,但其前提是接收到数据。所以,先来充实创建串口时就已经提到的Sp_DataReceived函数

private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e){    byte[] data = new byte[sp.BytesToRead];    sp.Read(data, 0, data.Length);//从串口读取数据    Dispatcher.Invoke(() => spReceived(data));}private void spReceived(byte[] data){    string info = Encoding.UTF8.GetString(data);    txtInfo.AppendText("串口接收数据:{info}");    if ((bool)chkTransmit.IsChecked)    {        try        {            udp.Send(data, data.Length, ptDst);    //将内容发给ptDst            txtInfo.AppendText($"UDP转发:{info}");        }        catch (Exception ex)        {            txtInfo.AppendText($"UDP转发失败,原因为{ex}\nd");        }    }}

然后创建UPD接收和转发函数

private void udpReceiving(CancellationToken token){    while (! token.IsCancellationRequested)    {        var data = udp.Receive(ref ptDst);        Dispatcher.Invoke(() => udpReceived(data));    }}private void udpReceived(byte[] data){    string info = Encoding.UTF8.GetString(data);    txtInfo.AppendText("UDP接收数据:{info}");    if ((bool)chkTransmit.IsChecked)    {        try        {            sp.Write(data, 0, data.Length);            txtInfo.AppendText($"串口转发{info}\n");        }        catch (Exception ex)        {            txtInfo.AppendText($"串口转发失败,原因为{ex}");        }    }}

其中,udpReceiving里面是一个死循环,表示一直等待UDP信息的到来,这个函数作为一个Task的创建时机,自然是在UDP服务创建之时,

//...txtInfo.AppendText("成功创建服务");//这是一个全局变量cts = new CancellationTokenSource();Task.Run(() => udpReceiving(cts.Token), cts.Token);

测试

至此,一个串口-UDP转发工具便算完成了,尽管界面上还有几个功能没有实现,比如Hex以及时间的单选框等,但这些均为锦上添花。

下面做一下基础的测试,效果如下

基于WPF怎么编写一个串口转UDP工具

以上就是关于“基于WPF怎么编写一个串口转UDP工具”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 基于WPF怎么编写一个串口转UDP工具

本文链接: https://lsjlt.com/news/354986.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于WPF编写一个串口转UDP工具
    目录框架准备初始化串口设置UDP设置发送设置转发设置测试串口是设备和上位机通信的常用接口,UDP则是网络通信常用的通信协议,通过将串口设备上传的指令,用UDP发送出去,或者将UDP传...
    99+
    2023-05-14
    WPF实现串口转UDP WPF串口转UDP WPF 串口 UDP
  • 基于WPF怎么编写一个串口转UDP工具
    这篇“基于WPF怎么编写一个串口转UDP工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于WPF怎么编写一个串口转UDP...
    99+
    2023-07-05
  • 基于Python编写一个ISBN查询工具
    目录1.引言2.实例分析3.总结1.引言 效果图: ISBN查询工具通常用于图书管理、图书销售、图书收集和阅读等场景。以下是一些具体的应用场景: 图书管理系统:ISBN查询工具可以...
    99+
    2023-05-19
    Python制作ISBN查询工具 Python ISBN查询工具 Python ISBN查询 Python ISBN
  • 基于Java编写一个PDF与Word文件转换工具
    目录前言实现方法pom.xml策略接口PDF转图片实现PDF转word实现word转htmlword转图片word转pdf使用前言 前段时间一直使用到word文档转pdf或者pdf转...
    99+
    2023-01-10
    Java PDF转Word Java Word转PDF Java Word PDF
  • 基于vite2+Vue3编写一个在线帮助文档工具
    目录技术栈建立库项目(@naturefw/press-edit)实现文档的编写、浏览功能编辑状态的功能浏览状态的功能实现导航实现菜单实现n级分组菜单实现菜单的维护功能实现Markdo...
    99+
    2024-04-02
  • 基于PyQt5实现一个串口接数据波形显示工具
    目录工具简述主程序代码Qt Designer设计UI界面程序运行效果工具简述 基于PyQt5开发UI界面使用QtDesigner设计,需要使用到serial模块(串口库)和pyqtg...
    99+
    2023-01-14
    PyQt5数据波形显示工具 PyQt5数据波形显示 PyQt5数据波形
  • 基于Python怎么编写微信清理工具
    这篇“基于Python怎么编写微信清理工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么编写微信清理工具...
    99+
    2023-06-30
  • 基于JavaScript编写一个图片转PDF转换器
    目录JavaScript 实现图片转 PDF第一步: PDF Converter的基本结构第二步: 图片预览框第 3 步: 图像到 PDF 转换器的按钮第 4 步: 在 JavaSc...
    99+
    2024-04-02
  • 基于vite2+Vue3如何编写一个在线帮助文档工具
    本篇内容主要讲解“基于vite2+Vue3如何编写一个在线帮助文档工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于vite2+Vue3如何编写一个在线帮助文档工具”吧!技术栈vite: ^...
    99+
    2023-06-29
  • 基于Python制作一个多进制转换工具
    目录前言主要步骤完整代码前言 学习资料下载链接 提取码:9d4g  进制转换计算工具含源文件 主要步骤 导入模块 import tkinter from tki...
    99+
    2024-04-02
  • 基于Python怎么编写一个点名器
    这篇文章主要介绍“基于Python怎么编写一个点名器”,在日常操作中,相信很多人在基于Python怎么编写一个点名器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Python怎么编写一个点名器”的疑惑有所...
    99+
    2023-07-02
  • 使用Java编写一个图片word互转工具
    目录前言实现方法使用前言 前段时间一直使用到word文档转pdf或者pdf转word,寻思着用Java应该是可以实现的,于是花了点时间写了个文件转换工具 源码weloe/FileCo...
    99+
    2023-01-10
    图片word互转工具 PDF Word文件转换工具 java图片word互转
  • 分享一个基于PHP的时间戳转换工具
    在Web开发的过程中,我们常常需要对时间相关的数据进行操作和处理。在PHP中,时间戳是一个常用的时间表示方式。然而,时间戳是一个以秒为单位的数字,对于人类来说并不直观易懂。因此,我们需要一个时间戳转换工具,能够将时间戳转换为易于理解的日期时...
    99+
    2023-05-14
    php php时间戳
  • 基于C++怎么编写一个Json解析器
    这篇文章主要介绍了基于C++怎么编写一个Json解析器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于C++怎么编写一个Json解析器文章都会有所收获,下面我们一起来看看吧。代码JsonSerialize.h...
    99+
    2023-07-05
  • 如何在Android中编写一个Intent跳转工具类
    这篇文章给大家介绍如何在Android中编写一个Intent跳转工具类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的...
    99+
    2023-05-30
    android intent
  • 怎么用python编写一个图片拼接工具
    本文小编为大家详细介绍“怎么用python编写一个图片拼接工具”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用python编写一个图片拼接工具”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。代码展示这里写了两...
    99+
    2023-06-28
  • 基于Python编写一个简单的端口扫描器
    目录1、需要的库2、获取一个 host 地址3、循环所有的端口4、完整脚本端口扫描是非常实用的,不止用在信息安全方面,日常的运维也用得到。这方面的工具也不要太多,搞过 CTF 的朋友...
    99+
    2024-04-02
  • 基于Python编写一个爆炸信息窗口脚本
    目录前言爆炸信息窗口设计思路模块准备删除好友警告源代码批量获取表情包前言 Hello!大家好,有好几天没有跟大家见面咯~不知道大家是否在等待《小玩意儿》专栏的更新呢 上一篇的文章【老...
    99+
    2024-04-02
  • 基于Java手写一个好用的FTP操作工具类
    目录前言windows服务器搭建FTP服务工具类方法代码展示使用示例前言 网上百度了很多FTP的java 工具类,发现文章代码都比较久远,且代码臃肿,即使搜到了代码写的还可以的,封装...
    99+
    2024-04-02
  • 一个基于C#开发的Excel转Json工具使用教程
    目录前言项目简介技术架构项目结构主要功能使用方式1、命令模式2、界面模式总结前言 Json在程序开发中是非常常用的数据格式,对于程序员来说,阅读和编辑Json都没有什么问题,但其他人...
    99+
    2022-11-13
    c# excel转json c#转json c# json
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作