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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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>
相关推荐
CODECOLLECT1 天前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen1 天前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠1 天前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_1 天前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技1 天前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计1 天前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报1 天前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业1 天前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能1 天前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn1 天前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件