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>
相关推荐
cjy_Somnr2 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰3 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤5 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟7 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞7 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲8 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up8 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技17 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志18 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣19 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法