• 第一个WPF程序(串口调试)


    本例子仅支持“ASCII”编码的串口数据发送与接收,如果需要其他编码,请自行更改,谢谢!

    界面代码如下:

     1 <Window x:Class="SerialPortDebug.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6         xmlns:local="clr-namespace:SerialPortDebug"
     7         mc:Ignorable="d"
     8         Title="串口调试助手 - ASCII" Height="450" Width="800" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
     9     <Grid Margin="0,0,0,0.5">
    10         <Grid.RowDefinitions>
    11             <RowDefinition Height="292*"/>
    12             <RowDefinition Height="131*"/>
    13         </Grid.RowDefinitions>
    14         <Grid.ColumnDefinitions>
    15             <ColumnDefinition Width="236"/>
    16             <ColumnDefinition/>
    17         </Grid.ColumnDefinitions>
    18         <GroupBox Header="配置" Margin="10" Grid.RowSpan="2">
    19             <Grid >
    20                 <Grid.ColumnDefinitions>
    21                     <ColumnDefinition Width="83"/>
    22                     <ColumnDefinition Width="121"/>
    23                 </Grid.ColumnDefinitions>
    24                 <Grid.RowDefinitions>
    25                     <RowDefinition Height="30"/>
    26                     <RowDefinition Height="30"/>
    27                     <RowDefinition Height="30"/>
    28                     <RowDefinition Height="30"/>
    29                     <RowDefinition Height="30"/>
    30                     <RowDefinition Height="30"/>
    31                     <RowDefinition Height="30"/>
    32                     <RowDefinition Height="14"/>
    33                     <RowDefinition/>
    34                 </Grid.RowDefinitions>
    35                 <Label Name="label1" Content="端口" Margin="37,2,9,2" VerticalAlignment="Center" Height="26" HorizontalContentAlignment="Right"/>
    36                 <Label Name="label2" Content="波特率" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="54" Grid.Row="1" HorizontalAlignment="Right" HorizontalContentAlignment="Right"/>
    37                 <Label Name="label3" Content="奇偶校验位" HorizontalAlignment="Right" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="71" Grid.Row="2" HorizontalContentAlignment="Right"/>
    38                 <Label Name="label4" Content="停止位" HorizontalAlignment="Right" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="54" Grid.Row="3" HorizontalContentAlignment="Right"/>
    39                 <Label Name="label5" Content="数据位" HorizontalAlignment="Right" Margin="0,4,10,2" VerticalAlignment="Center" Height="24" Width="54" Grid.Row="4" HorizontalContentAlignment="Right"/>
    40                 <Label  Name="label6" Content="流控制" HorizontalAlignment="Right" VerticalAlignment="Center" Height="25" Width="54" Grid.Row="5" Margin="0,3,10,2" HorizontalContentAlignment="Right"/>
    41                 <Label  Name="label7" Content="超时(ms)" HorizontalAlignment="Right" VerticalAlignment="Center" Height="26" Width="61" Grid.Row="6" Margin="0,2,10,2" HorizontalContentAlignment="Right"/>
    42                 <ComboBox Name="comboBox1" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22"/>
    43                 <ComboBox Name="comboBox2" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="1"/>
    44                 <ComboBox Name="comboBox3" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="2"/>
    45                 <ComboBox Name="comboBox4" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="3"/>
    46                 <ComboBox Name="comboBox5" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="4"/>
    47                 <ComboBox Name="comboBox6" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="5"/>
    48                 <TextBox Name="textBox1" Grid.Column="1" Height="22" Margin="15,4,18,4" Grid.Row="6" TextWrapping="Wrap" Text="2000" VerticalAlignment="Center"/>
    49                 <Button Name="button1" Content="开启" Grid.Column="1" Margin="15,10,18,0" Grid.Row="8" VerticalAlignment="Top" Height="26" Click="button1_Click"/>
    50             </Grid>
    51         </GroupBox>
    52         <GroupBox Name="groupBox1" Grid.Column="1" Header="接收区" Margin="10,5,10,14.5">
    53             <Grid >
    54                 <Grid.RowDefinitions>
    55                     <RowDefinition Height="5*"/>
    56                     <RowDefinition Height="246*"/>
    57                 </Grid.RowDefinitions>
    58                 <Grid.ColumnDefinitions>
    59                     <ColumnDefinition/>
    60                 </Grid.ColumnDefinitions>
    61                 <TextBox Name="textBox2" Margin="10,5,10,10" Grid.Row="1" TextWrapping="Wrap" Text="TextBox"/>
    62             </Grid>
    63         </GroupBox>
    64         <GroupBox Name="groupBox2" Grid.Column="1" Header="发送区" Margin="10,0.5,10,10" Grid.Row="1">
    65             <Grid>
    66                 <Grid.ColumnDefinitions>
    67                     <ColumnDefinition Width="317*"/>
    68                     <ColumnDefinition Width="70"/>
    69                     <ColumnDefinition Width="80"/>
    70                     <ColumnDefinition Width="80"/>
    71                 </Grid.ColumnDefinitions>
    72                 <Grid.RowDefinitions>
    73                     <RowDefinition/>
    74                     <RowDefinition Height="23"/>
    75                 </Grid.RowDefinitions>
    76                 <TextBox Name="textBox3" Margin="10,10,6,10" TextWrapping="Wrap" Text="TextBox" Grid.ColumnSpan="4"/>
    77                 <Button x:Name="button2" Content="回车发送" Grid.Column="2" HorizontalAlignment="Center" Margin="0" Grid.Row="1" VerticalAlignment="Center" Width="70" Height="19" Click="button2_Click"/>
    78                 <Button Name="button3" Content="直接发送" Grid.Column="3" HorizontalAlignment="Center" Margin="5,2" Grid.Row="1" VerticalAlignment="Center" Width="70" Height="19" Click="button3_Click"/>
    79 
    80             </Grid>
    81         </GroupBox>
    82 
    83     </Grid>
    84 </Window>

    如下图:

    后台代码:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Windows;
      6 using System.Windows.Controls;
      7 using System.Windows.Data;
      8 using System.Windows.Documents;
      9 using System.Windows.Input;
     10 using System.Windows.Media;
     11 using System.Windows.Media.Imaging;
     12 using System.Windows.Navigation;
     13 using System.Windows.Shapes;
     14 using System.IO.Ports;
     15 using System.Threading;
     16 
     17 namespace SerialPortDebug
     18 {
     19     /// <summary>
     20     /// MainWindow.xaml 的交互逻辑
     21     /// </summary>
     22     public partial class MainWindow : Window
     23     {
     24         public MainWindow()
     25         {
     26             InitializeComponent();
     27         }
     28        
     29         private void EnableReceiveAndSendGroup(bool isFirstLoad, bool enable)
     30         {
     31             groupBox1.IsEnabled = enable;
     32             if (isFirstLoad)
     33             {
     34                 textBox2.IsEnabled = false;
     35                 textBox2.Clear();
     36             }
     37             groupBox2.IsEnabled = enable;
     38             if (!textBox3.IsEnabled) textBox3.Clear();
     39         }
     40 
     41         private void LoadParameters()
     42         {
     43             EnableReceiveAndSendGroup(true,false);
     44             button1.IsEnabled = false;
     45             comboBox1.ItemsSource = SerialPortHelper.GetSerialPorts();
     46             if (comboBox1.Items.Count == 0) return;
     47             button1.IsEnabled = true;
     48             comboBox1.Text = comboBox1.Items[0].ToString();
     49             comboBox2.ItemsSource = SerialPortHelper.GetBaudRates();
     50             comboBox2.Text = comboBox2.Items[9].ToString();
     51             comboBox3.ItemsSource = SerialPortHelper.GetParities();
     52             comboBox3.Text = comboBox3.Items[0].ToString();
     53             comboBox4.ItemsSource = SerialPortHelper.GetStopBits();
     54             comboBox4.Text = comboBox4.Items[1].ToString();
     55             comboBox5.ItemsSource = SerialPortHelper.GetDataBits();
     56             comboBox5.Text = comboBox5.Items[1].ToString();
     57             comboBox6.ItemsSource = SerialPortHelper.GetFlowControls();
     58             comboBox6.Text = comboBox6.Items[0].ToString();
     59         }
     60 
     61         private void Window_Loaded(object sender, RoutedEventArgs e)
     62         {
     63             LoadParameters();
     64         }
     65 
     66         private void EnableConfig(bool enable)
     67         {
     68             if (enable) button1.Content = "开启";
     69             else button1.Content = "关闭";
     70             label1.IsEnabled = enable;
     71             label2.IsEnabled = enable;
     72             label3.IsEnabled = enable;
     73             label4.IsEnabled = enable;
     74             label5.IsEnabled = enable;
     75             label6.IsEnabled = enable;
     76             label7.IsEnabled = enable;
     77             comboBox1.IsEnabled = enable;
     78             comboBox2.IsEnabled = enable;
     79             comboBox3.IsEnabled = enable;
     80             comboBox4.IsEnabled = enable;
     81             comboBox5.IsEnabled = enable;
     82             comboBox6.IsEnabled = enable;
     83             textBox1.IsEnabled = enable;
     84         }
     85 
     86         SerialPort serialPort;
     87 
     88         private void button1_Click(object sender, RoutedEventArgs e)
     89         {
     90             if(button1.Content.ToString() == "开启")
     91             {
     92                 try
     93                 {
     94                     if(!int.TryParse(textBox1.Text,out int result))
     95                     {
     96                         MessageBox.Show("超时时间设置错误!");
     97                         return;
     98                     }
     99 
    100                     serialPort = new SerialPort(comboBox1.Text, 
    101                         SerialPortHelper.GetBaudRate(comboBox2.Text),
    102                         SerialPortHelper.GetParity(comboBox3.Text), 
    103                         SerialPortHelper.GetDataBit(comboBox5.Text),
    104                         SerialPortHelper.GetStopBit(comboBox4.Text))
    105                     { 
    106                         Handshake = SerialPortHelper.GetFlowControl(comboBox6.Text),
    107                         ReadTimeout = result
    108                     };
    109                     serialPort.Encoding = Encoding.ASCII;
    110                     serialPort.DataReceived += SerialPort_DataReceived;
    111                     serialPort.Open();
    112                     EnableConfig(false);
    113                     EnableReceiveAndSendGroup(false,true);
    114                 }
    115                 catch(Exception ex)
    116                 {
    117                     serialPort.Close();
    118                     MessageBox.Show(ex.Message);
    119                 }
    120             }
    121             else
    122             {
    123                 serialPort.Close();
    124                 EnableConfig(true);
    125                 EnableReceiveAndSendGroup(false,false);
    126             }
    127         }
    128 
    129         private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    130         {
    131             textBox2.Dispatcher.Invoke(new Action(() => 
    132             {
    133                 textBox2.Text += serialPort.ReadExisting();
    134             }));
    135         }
    136 
    137         private void button2_Click(object sender, RoutedEventArgs e)
    138         {
    139             string text = textBox3.Text + "
    ";
    140             serialPort.Write(Encoding.ASCII.GetBytes(text), 0, text.Length);
    141         }
    142 
    143         private void button3_Click(object sender, RoutedEventArgs e)
    144         {
    145             serialPort.Write(Encoding.ASCII.GetBytes(textBox3.Text), 0, textBox3.Text.Length);
    146         }
    147     }
    148 }
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace SerialPortDebug
     7 {
     8     class EnumHelper
     9     {
    10         public static T GetValue<T>(string valueString) => (T)Enum.Parse(typeof(T), valueString);
    11     }
    12 }
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.IO.Ports;
     6 
     7 namespace SerialPortDebug
     8 {
     9     class SerialPortHelper
    10     {
    11         public static string[] GetSerialPorts() => SerialPort.GetPortNames().OrderBy(x => x).ToArray();
    12         public static string[] GetBaudRates() => new string[] { "256000", "128000", "115200", "57600", "56000", "43000", "38400", "28800", "19200", "9600", "4800", "2400", "1200", "600", "300", "110" };
    13         public static string[] GetParities() => Enum.GetNames(typeof(Parity));
    14         public static string[] GetStopBits() => Enum.GetNames(typeof(StopBits));
    15         public static string[] GetDataBits() => new string[] { "7", "8", "9" };
    16         public static string[] GetFlowControls() => Enum.GetNames(typeof(Handshake));
    17 
    18         public static int GetBaudRate(string baudRates) => Convert.ToInt32(baudRates);
    19         public static Parity GetParity(string parity) => EnumHelper.GetValue<Parity>(parity);
    20         public static StopBits GetStopBit(string stopbit) => EnumHelper.GetValue<StopBits>(stopbit);
    21         public static int GetDataBit(string dataBit) => Convert.ToInt32(dataBit);
    22         public static Handshake GetFlowControl(string flowControl) => EnumHelper.GetValue<Handshake>(flowControl);
    23 
    24     }
    25 }

    运行结果如下:

  • 相关阅读:
    ajax 函数外调用
    a连接 h5点击有背景阴影
    禁止微信上下滑动
    ios 倒计时 不动 例如 2017-09-06 00:24:35
    6-10位 a-z || A-Z ||0-9 正则
    正则 不能输入中文
    正整数正则 (选择商品数量)
    手机号正则
    input输入框只能输入数字而且开头不能为零
    do...while02
  • 原文地址:https://www.cnblogs.com/cncc/p/12285131.html
Copyright © 2020-2023  润新知