Files

758 lines
23 KiB
XML

<Window
x:Class="WPFSerialAssistant.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"
Title="EF3串口解析助手 (Version 0.1)"
Width="1024"
Height="600"
MinWidth="1024"
MinHeight="550"
Closing="Window_Closing"
Icon="/icon/HexagonNew.ico"
PreviewKeyDown="Window_KeyDown"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<DockPanel Name="rootPanel">
<!-- 菜单栏 -->
<Menu
Name="menuBar"
Padding="2"
DockPanel.Dock="Top">
<!-- 文件 -->
<MenuItem Header="文件(_F)">
<MenuItem
Name="saveSerialDataMenuItem"
Click="saveSerialDataMenuItem_Click"
Header="保存(_S)"
Visibility="Collapsed" />
<MenuItem
Name="saveConfigMenuItem"
Click="saveConfigMenuItem_Click"
Header="保存配置" />
<MenuItem
Name="loadConfigMenuItem"
Click="loadConfigMenuItem_Click"
Header="加载配置(_L)"
Visibility="Collapsed" />
<MenuItem
Name="exitMenuItem"
Click="exitMenuItem_Click"
Header="退出" />
</MenuItem>
<!-- 设置 -->
<MenuItem Header="设置(_S)">
<MenuItem Header="发送追加">
<RadioButton
Name="appendNoneRadioButton"
Click="appendRadioButton_Click"
Content="无"
Tag="none" />
<RadioButton
Name="appendReturnRadioButton"
Click="appendRadioButton_Click"
Content="回车(\r)"
Tag="return" />
<RadioButton
Name="appednNewLineRadioButton"
Click="appendRadioButton_Click"
Content="新行(\n)"
IsChecked="True"
Tag="newline" />
<RadioButton
Name="appendReturnNewLineRadioButton"
Click="appendRadioButton_Click"
Content="回车新行(\r\n)"
Tag="retnewline" />
</MenuItem>
</MenuItem>
<!-- 视图 -->
<MenuItem Header="视图(_V)">
<MenuItem
Name="serialSettingViewMenuItem"
Click="serialSettingViewMenuItem_Click"
Header="串口配置面板"
IsChecked="True" />
<MenuItem
Name="autoSendDataSettingViewMenuItem"
Click="autoSendDataSettingViewMenuItem_Click"
Header="自动发送设置面板"
IsChecked="True" />
<MenuItem
Name="serialCommunicationSettingViewMenuItem"
Click="serialCommunicationSettingViewMenuItem_Click"
Header="通信设置面板"
IsChecked="True" />
<MenuItem
Name="compactViewMenuItem"
Click="compactViewMenuItem_Click"
Header="简洁视图"
IsChecked="False"
Visibility="Visible" />
</MenuItem>
<!-- 帮助 -->
<MenuItem Header="帮助(_H)">
<MenuItem
Name="aboutMenuItem"
Click="aboutMenuItem_Click"
Header="关于(_A)" />
<MenuItem
Name="helpMenuItem"
Click="helpMenuItem_Click"
Header="软件文档(_D)" />
</MenuItem>
</Menu>
<!-- 状态栏 -->
<StatusBar
Name="statusBar"
Padding="2"
Background="#FF007ACC"
DockPanel.Dock="Bottom">
<StatusBarItem HorizontalAlignment="Left">
<TextBlock Name="statusInfoTextBlock" Foreground="White">欢迎使用串口助手!</TextBlock>
</StatusBarItem>
<StatusBarItem>
<ProgressBar
Name="progressBar"
Width="150"
Height="10"
Margin="10,0,0,0"
Background="{Binding ElementName=statusBar, Path=Background}"
BorderBrush="White"
Foreground="White"
IsIndeterminate="True"
SmallChange="1"
Visibility="Collapsed"
Value="10" />
</StatusBarItem>
<StatusBarItem
Name="dataRecvStatusBarItem"
Margin="0,0,0,0"
Visibility="Collapsed">
<StackPanel Orientation="Horizontal">
<Ellipse
Width="5"
Height="5"
Margin="0,0,5,0"
Fill="White" />
<Ellipse
Width="5"
Height="5"
Margin="0,0,5,0"
Fill="White" />
<Ellipse
Width="5"
Height="5"
Margin="0,0,5,0"
Fill="White" />
<Ellipse
Width="5"
Height="5"
Margin="0,0,5,0"
Fill="White" />
<Ellipse
Width="5"
Height="5"
Margin="0,0,5,0"
Fill="White" />
<Ellipse
Width="5"
Height="5"
Fill="White" />
</StackPanel>
</StatusBarItem>
<StatusBarItem HorizontalAlignment="Right">
<TextBlock Name="timeDateTextBlock" Foreground="White" />
</StatusBarItem>
</StatusBar>
<Grid>
<DockPanel>
<!-- 串口配置面板 -->
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid DockPanel.Dock="Left" Visibility="Visible">
<GroupBox
Name="serialPortConfigPanel"
Margin="5,5,0,5"
BorderBrush="#FF7199E0"
BorderThickness="1"
Header="串口配置">
<DockPanel>
<!-- 可用端口 -->
<Grid Margin="0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="0,0,25,0"
VerticalAlignment="Center"
Text="可用端口" />
<ComboBox
Name="portsComboBox"
Grid.Column="1"
Width="120"
Padding="5"
IsEnabled="False" />
</Grid>
<!-- 通讯波特率 -->
<Grid Margin="0,0,0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="通讯波特率" />
<ComboBox
Name="baudRateComboBox"
Grid.Column="1"
Width="120"
Padding="5"
IsEditable="True">
<ComboBoxItem>1200</ComboBoxItem>
<ComboBoxItem>2400</ComboBoxItem>
<ComboBoxItem>4800</ComboBoxItem>
<ComboBoxItem>9600</ComboBoxItem>
<ComboBoxItem>19200</ComboBoxItem>
<ComboBoxItem>38400</ComboBoxItem>
<ComboBoxItem>115200</ComboBoxItem>
<ComboBoxItem IsSelected="True">256000</ComboBoxItem>
</ComboBox>
</Grid>
<!-- 奇偶校验位 -->
<Grid Margin="0,0,0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="奇偶校验位" />
<ComboBox
Name="parityComboBox"
Grid.Column="1"
Width="120"
Padding="5"
Text="无(None)">
<ComboBoxItem IsSelected="True" Tag="None">无(None)</ComboBoxItem>
<ComboBoxItem Tag="Even">偶校验(Even)</ComboBoxItem>
<ComboBoxItem Tag="Odd">奇校验(Odd)</ComboBoxItem>
<ComboBoxItem Tag="Space">保留为0(Space)</ComboBoxItem>
<ComboBoxItem Tag="Mark">保留为1(Mark)</ComboBoxItem>
</ComboBox>
</Grid>
<!-- 数据位 -->
<Grid Margin="0,0,0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="数据位" />
<ComboBox
Name="dataBitsComboBox"
Grid.Column="1"
Width="120"
Padding="5">
<ComboBoxItem IsSelected="True">8</ComboBoxItem>
<ComboBoxItem>7</ComboBoxItem>
<ComboBoxItem>6</ComboBoxItem>
<ComboBoxItem>5</ComboBoxItem>
</ComboBox>
</Grid>
<!-- 停止位 -->
<Grid Margin="0,0,0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="停止位" />
<ComboBox
Name="stopBitsComboBox"
Grid.Column="1"
Width="120"
Padding="5">
<ComboBoxItem IsSelected="True">1</ComboBoxItem>
<ComboBoxItem>1.5</ComboBoxItem>
<ComboBoxItem>2</ComboBoxItem>
</ComboBox>
</Grid>
<!-- 字节编码 -->
<Grid Margin="0,0,0,10" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Center"
Text="字节编码" />
<ComboBox
Name="encodingComboBox"
Grid.Column="1"
Width="120"
Padding="5">
<ComboBoxItem IsSelected="True">Default</ComboBoxItem>
<ComboBoxItem>ASCII</ComboBoxItem>
<ComboBoxItem>Unicode</ComboBoxItem>
<ComboBoxItem>UTF-8</ComboBoxItem>
</ComboBox>
</Grid>
<Grid DockPanel.Dock="Bottom">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<Button
Name="openClosePortButton"
Grid.Column="0"
Margin="5"
Padding="3"
Click="openClosePortButton_Click"
IsEnabled="{Binding ElementName=portsComboBox, Path=IsEnabled}">
打开
</Button>
<Button
Name="findPortButton"
Grid.Column="1"
Margin="5"
Padding="3"
Click="findPortButton_Click">
查找
</Button>
</Grid>
<!-- 空的Grid,占位用 -->
<Grid>
<StackPanel Margin="5">
<TextBlock
Padding="5"
FontSize="16"
Foreground="#FF0078D7">
主要功能:
</TextBlock>
<TextBlock Padding="5">1. 可自由显示、隐藏的设置面板</TextBlock>
<TextBlock Padding="5">2. 简洁视图模式,专注于数据收发</TextBlock>
<TextBlock Padding="5">3. 软件主要配置可保存并恢复</TextBlock>
<TextBlock
Padding="5"
FontSize="16"
Foreground="#FF0078D7">
快捷键提示:
</TextBlock>
<TextBlock Padding="5">1. Ctrl+S: 保存接收区数据</TextBlock>
<TextBlock Padding="5">2. Ctrl+Enter: 进/退简洁视图模式</TextBlock>
<TextBlock Padding="5">3. Enter: 发送数据</TextBlock>
</StackPanel>
</Grid>
</DockPanel>
</GroupBox>
</Grid>
</ScrollViewer>
<!-- EF3模式设置 -->
<Grid
Name="EF3ConfigPanel"
Margin="0,5,5,5"
DockPanel.Dock="Right"
Visibility="Visible">
<GroupBox
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="EF3板设置">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="45*" />
<RowDefinition Height="80*" />
</Grid.RowDefinitions>
<!-- EF3锁存模式 -->
<GroupBox
Grid.Row="0"
Margin="5"
Header="锁存模式">
<StackPanel>
<RadioButton
Name="singleLatch"
Margin="5"
Checked="SingleLatch_Checked"
IsChecked="True"
Tag="char"
ToolTip="点击即锁存一次并读取一次">
单次锁存
</RadioButton>
<RadioButton
Name="timingLatches"
Margin="5"
Checked="TimingLatches_Checked"
Tag="hex"
ToolTip="定时模式,每10ms(1000*10us),即100HZ,锁存一次位置的值,发一个脉冲">
定时锁存
</RadioButton>
<ComboBox
Name="timeRateComboBox"
Grid.Column="1"
Width="100"
Margin="5"
Padding="5"
IsEditable="True">
<ComboBoxItem IsSelected="True">1000</ComboBoxItem>
<ComboBoxItem>2000</ComboBoxItem>
</ComboBox>
<RadioButton
Name="freDivsionRadioButton"
Margin="5"
Checked="FreDivsionRadioButton_Checked"
Tag="dec"
ToolTip="设置成分频锁存模式。以X轴为基准,每20个脉冲锁存一次,并发送一次脉冲">
分频锁存
</RadioButton>
<ComboBox
Name="freRateComboBox"
Grid.Column="1"
Width="100"
Margin="5"
Padding="5"
IsEditable="True">
<ComboBoxItem IsSelected="True">20</ComboBoxItem>
<ComboBoxItem>100</ComboBoxItem>
</ComboBox>
</StackPanel>
</GroupBox>
<!-- EF3功能按键 -->
<GroupBox
Grid.Row="1"
Margin="5"
Header="功能按键">
<StackPanel>
<Button
x:Name="getVersionButton"
Margin="5"
Padding="3"
Click="GetVersionButton_Click"
Content="获取EF3固件版本" />
<Button
x:Name="setZeroButton"
Margin="5"
Padding="3"
Click="SetZeroButton_Click"
Content="设置零点" />
<Button
x:Name="startRecordButtion"
Margin="5"
Padding="3"
Click="StartRecordButtion_Click"
Content="开始锁存" />
<Button
x:Name="stopRecordButton"
Margin="5"
Padding="3"
Click="StopRecordButton_Click"
Content="停止锁存" />
<Button
x:Name="getRecordButton"
Margin="5"
Padding="3"
Click="GetRecordButton_Click"
Content="读取锁存值" />
<Button
x:Name="clearFlashButton"
Margin="5"
Padding="3"
Click="ClearFlashButton_Click"
Content="清除flash" />
<Button
x:Name="getPointsButton"
Margin="5"
Padding="3"
Click="GetPointsButton_Click"
Content="获取锁存点的数量" />
</StackPanel>
</GroupBox>
</Grid>
</GroupBox>
</Grid>
<!-- 通讯设置面板 -->
<Grid
Name="serialCommunicationConfigPanel"
Margin="0,5,5,5"
DockPanel.Dock="Right"
Visibility="Visible">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<GroupBox
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="通信设置">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="12*" />
<RowDefinition Height="10*" />
</Grid.RowDefinitions>
<GroupBox
Grid.Row="0"
Margin="5"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="接收设置">
<StackPanel>
<GroupBox
Margin="5"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="显示方式">
<StackPanel>
<RadioButton
Name="recvCharacterRadioButton"
Margin="0,5"
Checked="recvModeButton_Checked"
IsChecked="True"
Tag="char">
字符串
</RadioButton>
<RadioButton
Name="recvHexRadioButton"
Margin="0,0,50,5"
Checked="recvModeButton_Checked"
Tag="hex">
十六进制
</RadioButton>
<RadioButton
Name="recvDecRadioButton"
Margin="0,0,50,5"
Checked="recvModeButton_Checked"
Tag="dec">
十进制
</RadioButton>
<RadioButton
Name="recvOctRadioButton"
Margin="0,0,50,5"
Checked="recvModeButton_Checked"
Tag="oct">
八进制
</RadioButton>
<RadioButton
Name="recvBinRadioButton"
Margin="0,0,50,5"
Checked="recvModeButton_Checked"
Tag="bin">
二进制
</RadioButton>
</StackPanel>
</GroupBox>
<StackPanel>
<CheckBox
Name="showRecvDataCheckBox"
Margin="10,5"
Padding="0"
Click="showRecvDataCheckBox_Click"
Content="显示接收数据"
IsChecked="True" />
<Button
Name="saveRecvDataButton"
Margin="10,5"
Padding="3"
Click="saveRecvDataButton_Click"
Content="保存接收区数据"
ToolTip="使用Ctrl+S也可以快捷保存哦!" />
<Button
Name="clearRecvDataBoxButton"
Margin="10,5"
Padding="3"
Click="clearRecvDataBoxButton_Click"
Content="清空接收区" />
</StackPanel>
</StackPanel>
</GroupBox>
<GroupBox
Grid.Row="1"
Margin="5"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="发送设置">
<StackPanel>
<GroupBox
Margin="5,5,5,0"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="发送方式">
<StackPanel>
<RadioButton
Name="sendCharacterRadioButton"
Margin="0,5"
Click="sendDataModeRadioButton_Click"
Content="字符串"
IsChecked="True"
Tag="char" />
<RadioButton
Name="sendHexRadioButton"
Margin="0,0,0,5"
Click="sendDataModeRadioButton_Click"
Content="十六进制"
Tag="hex" />
</StackPanel>
</GroupBox>
<GroupBox
Margin="5"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="发送内容">
<StackPanel>
<RadioButton
Name="manualInputRadioButton"
Margin="0,5"
Click="manualInputRadioButton_Click"
Content="手动输入"
IsChecked="True" />
<RadioButton
Name="loadFileRadioButton"
Margin="0,0,0,5"
Click="loadFileRadioButton_Click"
Content="加载文件"
IsEnabled="False" />
</StackPanel>
</GroupBox>
<Button
Name="clearSendDataTextBox"
Margin="10,5,10,0"
Padding="3"
Click="clearSendDataTextBox_Click"
Content="清空发送区" />
</StackPanel>
</GroupBox>
</Grid>
</GroupBox>
</ScrollViewer>
</Grid>
<!-- 自动发送设置面板 -->
<Grid
Name="autoSendConfigPanel"
Margin="5"
DockPanel.Dock="Bottom"
Visibility="Visible">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<GroupBox
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="自动发送设置">
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" />
<ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<TextBlock
Grid.Column="0"
Padding="5"
TextAlignment="Center">
自动发送时间间隔
</TextBlock>
<TextBox
Name="autoSendIntervalTextBox"
Grid.Column="1"
Width="100"
Margin="10,0"
Padding="5"
Text="1000"
ToolTip="自动发送时间只有在启动自动发送前修改有效;发送过程中修改时间只会在下一次启动自动发送时生效。" />
<ComboBox
Name="timeUnitComboBox"
Grid.Column="2"
Width="60"
Padding="5">
<ComboBoxItem IsSelected="True">毫秒</ComboBoxItem>
<ComboBoxItem>秒钟</ComboBoxItem>
<ComboBoxItem>分钟</ComboBoxItem>
</ComboBox>
</StackPanel>
<CheckBox
Name="autoSendEnableCheckBox"
Grid.Column="1"
Margin="0,0,5,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Click="autoSendEnableCheckBox_Click"
ToolTip="使能后,必须要再次点击发送按钮才可以启动自动发送。">
使能自动发送
</CheckBox>
</Grid>
</GroupBox>
</ScrollViewer>
</Grid>
<!-- 接收区/发送区 -->
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="85*" />
<RowDefinition Height="80" />
</Grid.RowDefinitions>
<GroupBox
Grid.Row="0"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="接收区">
<RichTextBox
Name="recvDataRichTextBox"
Margin="2,5"
BorderThickness="0"
IsReadOnly="True">
<FlowDocument
FontFamily="Lucida Console"
FontSize="14"
LineHeight="1.5" />
</RichTextBox>
</GroupBox>
<GroupBox
Grid.Row="1"
BorderBrush="{Binding ElementName=serialPortConfigPanel, Path=BorderBrush}"
BorderThickness="{Binding ElementName=serialPortConfigPanel, Path=BorderThickness}"
Header="发送区"
IsEnabled="{Binding ElementName=portsComboBox, Path=IsEnabled}">
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90*" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<TextBox
Name="sendDataTextBox"
Grid.Column="0"
Margin="5,0,0,0"
Padding="15"
VerticalAlignment="Center"
FontFamily="Lucida Console">
Hello, world!
</TextBox>
<Button
Name="sendDataButton"
Grid.Column="1"
Margin="5,0"
Padding="3"
VerticalAlignment="Center"
Click="sendDataButton_Click"
Content="发送" />
<Grid />
</Grid>
</GroupBox>
</Grid>
</DockPanel>
</Grid>
</DockPanel>
</Window>