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>
相关推荐
森焱森8 分钟前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
小殷学长2 小时前
【单片机毕业设计17-基于stm32c8t6的智能倒车监测系统】
stm32·单片机·课程设计
TESmart碲视4 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
small_wh1te_coder4 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
花落已飘5 小时前
STM32中实现shell控制台(shell窗口输入实现)
stm32·单片机·嵌入式硬件
牵牛老人7 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
宇钶宇夕8 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨9 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao1009 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件
小眼睛FPGA11 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分/紫光同创 IP core 的使用及添加
科技·嵌入式硬件·ai·fpga开发·gpu算力