C# WPF上位机开发(串口界面设计)

news2025/1/25 7:02:16

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        如果只是把上位机看成是纯软件开发,本身不和硬件打交道的话,那么这就把上位机的操作范围给限定死了。事实上,上位机只要能和其他设备通信,就可以处理多方面的数据,也只有这样才能发挥上位机算力强的优势。目前来说,常用的上位机硬件接口很多,232、usb、can这些都算。而这些接口当中,尤其以串口232最为简单和便捷。

        很多的设备或者开发板,不仅自身可以提供232串口,还可以把232转成其他的接口,比如说232转485、232转can、232转网络等等,总之就是用起来非常方便。

1、串口的物理构成

        232一般就三条线,收、发、地。所谓的收就是接收,本身从外部设备接收数据;而发就是发送,数据从上位机发送出去;地就是共地,本身当成一个基准信号。

2、串口之上的协议更为重要

        232本身只是一个物理承载的接口,我们需要的其实是上面的数据内容。不同的数据内容,这就决定不同的设备用途。它可以是简单的IO设备,可以是充电设备,可以是工业PLC设备,这里面存在着各种各样的选择。所以232也好,485也好,can也好,这些都是数据通讯的运输方式,数据本身才是最最重要的内容。

3、串口界面的编写

        目前来说,市面上有很多的串口收发工具,大部分拿过来就可以用。不过还是建议大家可以把这部分工具拿过来模仿一下,模仿它的界面,模仿它们的功能。只有亲自去做,去测试,并且在这过程中犯了错,才能得到更好地体会和认识串口的用途。

        目前的界面一般都会分成左右两个部分,一部分是属性配置,一部分是收发数据显示。

4、界面布局和xaml编写

        用c# wpf编写串口的界面还是非常容易的。常用的控件基本上就是label、textbox、button、combobox、radio button、checkbox这些就够了。剩下来的工作就是如何去布局和设计。学习之初,建议大家还是以模仿为主,等学习的内容比较多了,可以自己去独立设计的时候,再来自己做比较合适。

        界面上还是按照先grid分区,后stack布局的方式进行。当然利用grid里面嵌套grid,这本身也是可以的。等grid完成之后,在每一个space里面,就接着在vertical方向,或者在horizontal方向开始添加控件。放置的时候需要注意下上下的间隔,或者是左右的间隔。部分需要内容高亮的部分,最好也要高亮起来,这样会显得比较美观一些。

        最后为了方便大家学习和参考,这里给出完整代码,权且是抛砖引玉,希望大家设计出更好的界面内容。当然如果需要实际编程的话,直接引入using System.IO.Ports即可。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp"
        mc:Ignorable="d"
        Title="串口处理工具(V1.0)" Height="500" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height=" 330"/>
            <RowDefinition/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Row="0" Grid.Column="0" Margin="10,10,10,10">
            <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                <Label  Content="串   口:"/>
                <ComboBox Width="80">
                    <ComboBoxItem IsSelected="True">COM1</ComboBoxItem>
                    <ComboBoxItem>COM2</ComboBoxItem>
                    <ComboBoxItem>COM3</ComboBoxItem>
                    <ComboBoxItem>COM4</ComboBoxItem>
                    <ComboBoxItem>COM5</ComboBoxItem>
                    <ComboBoxItem>COM6</ComboBoxItem>
                    <ComboBoxItem>COM7</ComboBoxItem>
                    <ComboBoxItem>COM8</ComboBoxItem>
                    <ComboBoxItem>COM9</ComboBoxItem>
                </ComboBox>
            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
                <Label  Content="波特率:"/>
                <ComboBox Width="80">
                    <ComboBoxItem IsSelected="True">4800</ComboBoxItem>
                    <ComboBoxItem>9600</ComboBoxItem>
                    <ComboBoxItem>19200</ComboBoxItem>
                    <ComboBoxItem>38400</ComboBoxItem>
                    <ComboBoxItem>57600</ComboBoxItem>
                    <ComboBoxItem>115200</ComboBoxItem>
                </ComboBox>
            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
                <Label  Content="数据位:"/>
                <ComboBox Width="80">
                    <ComboBoxItem IsSelected="True">8</ComboBoxItem>
                    <ComboBoxItem>9</ComboBoxItem>
                    <ComboBoxItem>10</ComboBoxItem>
                </ComboBox>
            </StackPanel>
            
            <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
                <Label  Content="校验位:"/>
                <ComboBox Width="80">
                    <ComboBoxItem IsSelected="True">None</ComboBoxItem>
                    <ComboBoxItem>1</ComboBoxItem>
                </ComboBox>
            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
                <Label  Content="停止位:"/>
                <ComboBox Width="80">
                    <ComboBoxItem IsSelected="True">None</ComboBoxItem>
                    <ComboBoxItem>1</ComboBoxItem>
                </ComboBox>
            </StackPanel>
            <Button Content="打开串口" Margin="0,10,0,0" Height="35" VerticalContentAlignment="Center" />

            <StackPanel  Margin="0,10,0,0">
                <StackPanel Orientation="Horizontal"   >
                    <RadioButton Content="ASCII" IsChecked="True" Margin="0,0,0,0"/>
                    <RadioButton Content="HEX" Margin="15,0,0,0"/>
                </StackPanel>
                <CheckBox Content="显示接收数据时间" Margin="0,10,0,0" IsChecked="True" />
                <Button Content="清空接收" Height="35" Margin="0,10,0,0"/>
            </StackPanel>
        </StackPanel>

        <StackPanel Grid.Row="1" Grid.Column="0" Margin="10,0,0,0">
            <StackPanel Orientation="Horizontal"   Margin="0,10,0,0" >
                <RadioButton Content="ASCII" IsChecked="True" Margin="0,0,0,0"/>
                <RadioButton Content="HEX" Margin="15,0,0,0"/>
            </StackPanel>
            <CheckBox Content="发送新行" IsChecked="False" Margin="0,10,0,0" />
            <StackPanel Orientation="Horizontal"   >
                <CheckBox Content="自动发送" Margin="0,10,0,0" IsChecked="True"  IsEnabled="True"/>
                <TextBox Width="30" Text="1" FontSize="16" Margin="20,0,0,0" IsEnabled="True"/>
                <Label Content="s"/>
            </StackPanel>
        </StackPanel>

        <StackPanel Grid.Row="0" Grid.Column="1" Margin="0,10,0,0">
            <TextBox Width="618" Height="304"></TextBox>
        </StackPanel>

        <StackPanel Grid.Row="1" Grid.Column="1" Margin="0,0,0,0" Orientation="Horizontal">
            <TextBox Width="490" Height="80" FontSize="20" Margin="10,0,0,0"/>
            <Button Content="发送" Margin="10,10,0,10" Width="102" Height="45"/>
        </StackPanel>

        <StackPanel Grid.Row="2" Grid.ColumnSpan="2" Margin="10,10,0,5" Orientation="Horizontal">
            <Label Content="串口已经关闭" Foreground="Red"/>
            <Label Content="Tx:0 Bytes     Rx:0 Bytes"  Margin="200,0,0,0"/>
            <Label Content="@V1.0"  Foreground="Green" Margin="280,0,0,0"/>
        </StackPanel>
    </Grid>
</Window>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础-JDK的组成

目录 1. JDK的组成2.Java的跨平台、工作原理 1. JDK的组成 JVM&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方核心类库&#xff1a;Java自己写好的程序&#xff0c;给程序员自己的程序调用的JRE&#xff1a;Java的运行环境JDK&#xff1a;Java开发工具包 JDK是由J…

LinuxBasicsForHackers笔记 -- 文件系统和存储设备管理

设备目录/dev Linux 有一个特殊的目录&#xff0c;其中包含代表每个连接设备的文件&#xff1a;相应命名的 /dev 目录。 /dev中有很多设备列表。 特别令人感兴趣的是设备 sda1、sda2、sda3、sdb 和 sdb1&#xff0c;它们通常是硬盘驱动器及其分区以及 USB 闪存驱动器及其分区…

嵌入式设备OTA升级的大致过程!

OTA概述 大家好&#xff0c;我是一个软件升级包。这几天呢&#xff0c;我将会进行一次神奇的网络之旅&#xff0c;从开发者的电脑中&#xff0c;一直跑到终端嵌入式设备中。 大家都把我的这个旅游过程叫做 OTA&#xff0c;也就是在线升级。 那么啥叫 OTA 呢&#xff1f;全称…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

KUKA机器人在编程时添加需要等待的输入信号的2种方法

KUKA机器人在编程时添加需要等待的输入信号的2种方法 第一种方法:手动输入法 如下图所示,选中某个程序后,点击下方的“打开”, 如下图所示,将光标定位到所需位置,然后按下左上角的“编辑”按钮,此时示教器上会弹出输入键盘, 如下图所示,在键盘上手动输入语句:wait fo…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#xff0c;目前市面上一些主流的内网穿透工具有&#xff1a;Ngrok&#xff0c;Natapp&…

西南科技大学C++程序设计实验十二(文件流操作)

一、实验目的 1. 熟悉文件的基本操作; 2. 在类中添加打开文件、保存文件、读取文件等处理函数; 二、实验任务 1. 分析完善程序:主函数创建一个文件对象,每次打开文件,在其尾部添加数据。如果文件不存在,则新建该文件。请将空白处需要完善的功能补充完整。 #include …

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台&#xff0c;但是由于还没有拿到EVT。所以&#xff0c;就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后&#xff0c;充满剩余时间异常的问题。 问题描述&#xff0c;在充电过程中&#xff0c;显示充满时间为“0 min left unt…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下&#xff1a;【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试&#xff0c;使用该类的实例执行关闭server时&#xff0c;并没有释放端口号&#xff0c;会导致第二次启动时失败。另外&#xff0c;使用该…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error&#xff01;新建messages_zh_CN.properties文件 user.login.error帐户或密码错误&#xff01;2. 新建LocaleConfig.java文件 Configurati…

geolife笔记:整理处理单条轨迹

以 数据集笔记 geolife &#xff08;操作篇&#xff09;_geolife数据集-CSDN博客 轨迹为例 1 读取数据 import pandas as pd data pd.read_csv(Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt,headerNone, skiprows6,names[Latitude, Longitude, Not_Im…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

如何提高Pycharm的使用体验?

汉化 文件---设置---插件---chinese---安装---重启ide 代码补全 tabnine 文件---设置---插件---tabnine---安装---重启ide 重启ide后生效&#xff0c;补全效果如下 自定义背景 文件---设置---外观---背景图像---选择图片---调整透明度保存即可 设置头部声明 英文版…

JVM学习笔记-如何在IDEA打印JVM的GC日志信息

若要在Idea上打印JVM相应GC日志&#xff0c;其实只需在Run/Debug Configurations上进行设置即可。 拿《深入Java虚拟机》书中的3-7代码例子来演示&#xff0c;如 1 public class JvmTest {2 private static final int _1MB1024*1024;3 public static void main(String…

理解基于 Hadoop 生态的大数据技术架构

转眼间&#xff0c;一年又悄然而逝&#xff0c;时光荏苒&#xff0c;岁月如梭。当回首这段光阴&#xff0c;不禁感叹时间的匆匆&#xff0c;仿佛只是一个眨眼的瞬间&#xff0c;一年的旅程已成为过去&#xff0c;而如今又到了画饼的时刻了 &#xff01; 基于 Hadoop 生态的大数…

快速认识什么是:Docker

Docker&#xff0c;一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢&#xff1f;今天就来一起学快速入门一下Docker吧&#xff01;希望本文对您有所帮助。 假设您使用 Cobol 构建了一个在某种奇怪风格的 Linux 上运行的应用程序。您…

Spring Boot Async:从入门到精通,原理详解与最佳实践

Spring Boot 的异步功能&#xff08;Async&#xff09;允许我们将某些任务异步执行&#xff0c;而不会阻塞主线程。这对于处理耗时的操作非常有用&#xff0c;如发送电子邮件、生成报表、调用外部 API 等。通过异步处理&#xff0c;我们可以释放主线程&#xff0c;让它继续处理…

【学习笔记】lyndon分解

摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大&#xff0c;可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的&#xff0c;则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…