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>
相关推荐
深圳市青牛科技实业有限公司1 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比2 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie2 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@3 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988725 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张6 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_739312879 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章9 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu9 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
基极向上的三极管10 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件