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


    界面设计:

    <Window x:Class="SerialPortDebug.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:SerialPortDebug"
            mc:Ignorable="d"
            Title="串口调试助手 - ASCII" Height="450" Width="800" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
        <Grid Margin="0,0,0,0.5">
            <Grid.RowDefinitions>
                <RowDefinition Height="292*"/>
                <RowDefinition Height="131*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="236"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <GroupBox Header="配置" Margin="10" Grid.RowSpan="2">
                <Grid >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="83"/>
                        <ColumnDefinition Width="121"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="30"/>
                        <RowDefinition Height="14"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Label Name="label1" Content="端口" Margin="37,2,9,2" VerticalAlignment="Center" Height="26" HorizontalContentAlignment="Right"/>
                    <Label Name="label2" Content="波特率" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="54" Grid.Row="1" HorizontalAlignment="Right" HorizontalContentAlignment="Right"/>
                    <Label Name="label3" Content="奇偶校验位" HorizontalAlignment="Right" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="71" Grid.Row="2" HorizontalContentAlignment="Right"/>
                    <Label Name="label4" Content="停止位" HorizontalAlignment="Right" Margin="0,2,10,2" VerticalAlignment="Center" Height="26" Width="54" Grid.Row="3" HorizontalContentAlignment="Right"/>
                    <Label Name="label5" Content="数据位" HorizontalAlignment="Right" Margin="0,4,10,2" VerticalAlignment="Center" Height="24" Width="54" Grid.Row="4" HorizontalContentAlignment="Right"/>
                    <Label  Name="label6" Content="流控制" HorizontalAlignment="Right" VerticalAlignment="Center" Height="25" Width="54" Grid.Row="5" Margin="0,3,10,2" HorizontalContentAlignment="Right"/>
                    <Label  Name="label7" Content="超时(ms)" HorizontalAlignment="Right" VerticalAlignment="Center" Height="26" Width="61" Grid.Row="6" Margin="0,2,10,2" HorizontalContentAlignment="Right"/>
                    <ComboBox Name="comboBox1" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22"/>
                    <ComboBox Name="comboBox2" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="1"/>
                    <ComboBox Name="comboBox3" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="2"/>
                    <ComboBox Name="comboBox4" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="3"/>
                    <ComboBox Name="comboBox5" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="4"/>
                    <ComboBox Name="comboBox6" Grid.Column="1" Margin="15,4,18,4" VerticalAlignment="Center" Height="22" Grid.Row="5"/>
                    <TextBox Name="textBox1" Grid.Column="1" Height="22" Margin="15,4,18,4" Grid.Row="6" TextWrapping="Wrap" Text="2000" VerticalAlignment="Center"/>
                    <Button Name="button1" Content="开启" Grid.Column="1" Margin="15,10,18,0" Grid.Row="8" VerticalAlignment="Top" Height="26" Click="button1_Click"/>
                </Grid>
            </GroupBox>
            <GroupBox Name="groupBox1" Grid.Column="1" Header="接收区" Margin="10,5,10,14.5">
                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="5*"/>
                        <RowDefinition Height="246*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBox Name="textBox2" Margin="10,5,10,10" Grid.Row="1" TextWrapping="Wrap" Text="TextBox"/>
                </Grid>
            </GroupBox>
            <GroupBox Name="groupBox2" Grid.Column="1" Header="发送区" Margin="10,0.5,10,10" Grid.Row="1">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="317*"/>
                        <ColumnDefinition Width="70"/>
                        <ColumnDefinition Width="80"/>
                        <ColumnDefinition Width="80"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="23"/>
                    </Grid.RowDefinitions>
                    <TextBox Name="textBox3" Margin="10,10,6,10" TextWrapping="Wrap" Text="TextBox" Grid.ColumnSpan="4"/>
                    <Button x:Name="button2" Content="回车发送" Grid.Column="2" HorizontalAlignment="Center" Margin="0" Grid.Row="1" VerticalAlignment="Center" Width="70" Height="19" Click="button2_Click"/>
                    <Button Name="button3" Content="直接发送" Grid.Column="3" HorizontalAlignment="Center" Margin="5,2" Grid.Row="1" VerticalAlignment="Center" Width="70" Height="19" Click="button3_Click"/>
    
                </Grid>
            </GroupBox>
    
        </Grid>
    </Window>

    主程序代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO.Ports;
    using System.Threading;
    
    namespace SerialPortDebug
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void EnableReceiveAndSendGroup(bool isFirstLoad, bool enable)
            {
                groupBox1.IsEnabled = enable;
                if (isFirstLoad)
                {
                    textBox2.IsEnabled = false;
                    textBox2.Clear();
                }
                groupBox2.IsEnabled = enable;
                if (!textBox3.IsEnabled) textBox3.Clear();
            }
    
            private void LoadParameters()
            {
                EnableReceiveAndSendGroup(true, false);
                button1.IsEnabled = false;
                comboBox1.ItemsSource = SerialPortHelper.GetSerialPorts();
                if (comboBox1.Items.Count == 0) return;
                button1.IsEnabled = true;
                comboBox1.Text = comboBox1.Items[0].ToString();
                comboBox2.ItemsSource = SerialPortHelper.GetBaudRates();
                comboBox2.Text = comboBox2.Items[9].ToString();
                comboBox3.ItemsSource = SerialPortHelper.GetParities();
                comboBox3.Text = comboBox3.Items[0].ToString();
                comboBox4.ItemsSource = SerialPortHelper.GetStopBits();
                comboBox4.Text = comboBox4.Items[1].ToString();
                comboBox5.ItemsSource = SerialPortHelper.GetDataBits();
                comboBox5.Text = comboBox5.Items[1].ToString();
                comboBox6.ItemsSource = SerialPortHelper.GetFlowControls();
                comboBox6.Text = comboBox6.Items[0].ToString();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                LoadParameters();
            }
    
            private void EnableConfig(bool enable)
            {
                if (enable) button1.Content = "开启";
                else button1.Content = "关闭";
                label1.IsEnabled = enable;
                label2.IsEnabled = enable;
                label3.IsEnabled = enable;
                label4.IsEnabled = enable;
                label5.IsEnabled = enable;
                label6.IsEnabled = enable;
                label7.IsEnabled = enable;
                comboBox1.IsEnabled = enable;
                comboBox2.IsEnabled = enable;
                comboBox3.IsEnabled = enable;
                comboBox4.IsEnabled = enable;
                comboBox5.IsEnabled = enable;
                comboBox6.IsEnabled = enable;
                textBox1.IsEnabled = enable;
            }
    
            SerialPort serialPort;
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                if (button1.Content.ToString() == "开启")
                {
                    try
                    {
                        if (!int.TryParse(textBox1.Text, out int result))
                        {
                            MessageBox.Show("超时时间设置错误!");
                            return;
                        }
    
                        serialPort = new SerialPort(comboBox1.Text,
                            SerialPortHelper.GetBaudRate(comboBox2.Text),
                            SerialPortHelper.GetParity(comboBox3.Text),
                            SerialPortHelper.GetDataBit(comboBox5.Text),
                            SerialPortHelper.GetStopBit(comboBox4.Text))
                        {
                            Handshake = SerialPortHelper.GetFlowControl(comboBox6.Text),
                            ReadTimeout = result
                        };
                        serialPort.Encoding = Encoding.ASCII;
                        serialPort.DataReceived += SerialPort_DataReceived;
                        serialPort.Open();
                        EnableConfig(false);
                        EnableReceiveAndSendGroup(false, true);
                    }
                    catch (Exception ex)
                    {
                        serialPort.Close();
                        MessageBox.Show(ex.Message);
                    }
                }
                else
                {
                    serialPort.Close();
                    EnableConfig(true);
                    EnableReceiveAndSendGroup(false, false);
                }
            }
    
            private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                textBox2.Dispatcher.Invoke(new Action(() =>
                {
                    textBox2.Text += serialPort.ReadExisting();
                }));
            }
    
            private void button2_Click(object sender, RoutedEventArgs e)
            {
                string text = textBox3.Text + "
    ";
                serialPort.Write(Encoding.ASCII.GetBytes(text), 0, text.Length);
            }
    
            private void button3_Click(object sender, RoutedEventArgs e)
            {
                serialPort.Write(Encoding.ASCII.GetBytes(textBox3.Text), 0, textBox3.Text.Length);
            }
        }
    }

    类:EnumHelper

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SerialPortDebug
    {
        class EnumHelper
        {
            public static T GetValue<T>(string valueString) => (T)Enum.Parse(typeof(T), valueString);
        }
    }

    类:SerialPortHelper

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO.Ports;
    
    namespace SerialPortDebug
    {
        class SerialPortHelper
        {
            public static string[] GetSerialPorts() => SerialPort.GetPortNames().OrderBy(x => x).ToArray();
            public static string[] GetBaudRates() => new string[] { "256000", "128000", "115200", "57600", "56000", "43000", "38400", "28800", "19200", "9600", "4800", "2400", "1200", "600", "300", "110" };
            public static string[] GetParities() => Enum.GetNames(typeof(Parity));
            public static string[] GetStopBits() => Enum.GetNames(typeof(StopBits));
            public static string[] GetDataBits() => new string[] { "7", "8", "9" };
            public static string[] GetFlowControls() => Enum.GetNames(typeof(Handshake));
    
            public static int GetBaudRate(string baudRates) => Convert.ToInt32(baudRates);
            public static Parity GetParity(string parity) => EnumHelper.GetValue<Parity>(parity);
            public static StopBits GetStopBit(string stopbit) => EnumHelper.GetValue<StopBits>(stopbit);
            public static int GetDataBit(string dataBit) => Convert.ToInt32(dataBit);
            public static Handshake GetFlowControl(string flowControl) => EnumHelper.GetValue<Handshake>(flowControl);
    
        }
    }
  • 相关阅读:
    居中
    redis之列表操作及在django中操作等相关内容-124
    模型类序列化器ModelSerializer的使用等相关内容-84
    序列化类Serializer的基础使用等相关内容-83
    redis的基础使用等相关内容-123
    django框架前后端混合项目之子评论、后台管理页面富文本编辑器、修改头像、修改密码等相关内容-81
    vue框架前后端分离项目之短信验证码、登录、注册接口及前端登陆注册功能等相关内容-122
    web开发模式及drf的介绍等相关内容-82
    django框架前后端混合项目之侧边栏及点赞点踩功能等相关内容-80
    django框架前后端混合项目之首页轮播图、主页、后台管理、头像显示等相关内容-79
  • 原文地址:https://www.cnblogs.com/yangjiaoshou/p/12868815.html
Copyright © 2020-2023  润新知