【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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>