本例子仅支持“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 + "\r"; 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 }
运行结果如下: