返回顶部
首页 > 资讯 > 精选 >C#如何实现串口调试工具
  • 239
分享到

C#如何实现串口调试工具

2023-06-29 00:06:44 239人浏览 独家记忆
摘要

C#如何实现串口调试工具,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前文由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个

C#如何实现串口调试工具,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前文

由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本的也很多, 功能扩展的很开也多。所以现在自己做了一个够用版,基于自己的需求,简单的实现发送接收功能, 至于那些扩展功能可以自己根据需求添加。

正文

先上个运行效果图:

C#如何实现串口调试工具

项目架构

该实例用的GalaSoft.Mvvm, 该插件可以直接在NuGet中并且添加。

C#如何实现串口调试工具

串口参数 , 为了方便, 端口号并没有用动态加载的方式, 如下枚举结构:

namespace System.windows.Data{    //    // 摘要:    //     提供将自定义逻辑应用于绑定的方法。    public interface IValueConverter    {        //        // 摘要:        //     转换值。        //        // 参数:        //   value:        //     绑定源生成的值。        //        //   targetType:        //     绑定目标属性的类型。        //        //   parameter:        //     要使用的转换器参数。        //        //   culture:        //     要用在转换器中的区域性。        //        // 返回结果:        //     转换后的值。 如果该方法返回 null,则使用有效的 null 值。        object Convert(object value, Type targetType, object parameter, CultureInfo culture);        //        // 摘要:        //     转换值。        //        // 参数:        //   value:        //     绑定目标生成的值。        //        //   targetType:        //     要转换为的类型。        //        //   parameter:        //     要使用的转换器参数。        //        //   culture:        //     要用在转换器中的区域性。        //        // 返回结果:        //     转换后的值。 如果该方法返回 null,则使用有效的 null 值。        object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);    }}

串口参数配置类 ,

作用: 主要用于绑定界面的参数选项。

/// <summary>    /// 串口参数设置类    /// </summary>    public class ComParameterConfig : ViewModelBase    {        public ComParameterConfig()        {            Port = System.Enum.GetValues(typeof(Port));            CheckMode = System.Enum.GetValues(typeof(CheckMode));            StopBit = System.Enum.GetValues(typeof(StopBit));            BaudRate = new List<int>() { 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, };            DataBit = new List<int>() { 6, 7, 8 };        }        private Array port;        private Array checkMode;        private Array stopBit;        private List<int> dataBit;        private List<int> baudRate;        /// <summary>        /// 端口        /// </summary>        public Array Port        {            get { return port; }            set { port = value; RaisePropertyChanged(); }        }        /// <summary>        /// 校验模式        /// </summary>        public Array CheckMode        {            get { return checkMode; }            set { checkMode = value; RaisePropertyChanged(); }        }        /// <summary>        /// 停止位        /// </summary>        public Array StopBit        {            get { return stopBit; }            set { stopBit = value; RaisePropertyChanged(); }        }        /// <summary>        /// 波特率        /// </summary>        public List<int> BaudRate        {            get { return baudRate; }            set { baudRate = value; RaisePropertyChanged(); }        }        /// <summary>        /// 数据位        /// </summary>        public List<int> DataBit        {            get { return dataBit; }            set { dataBit = value; RaisePropertyChanged(); }        }    }

当前配置参数类

作用: 用于保存当前的串口参数、串口功能开关接收数据等业务。

核心代码:

/// <summary>    /// 当前配置参数    /// </summary>    public class CurrentParameter : ViewModelBase    {        #region Private        private int baudRdate = 9600;        private int dataBit = 8;        private Port port;        private CheckMode checkMode;        private StopBit stopBit = StopBit.One;        private SerialPort serialPort;        private string dataReceiveInfo;        private string sendData;        private bool isOpen;        private bool receiveFORMat16 = true;        private bool sendFormat16 = true;        private int sendCount;        private int receiveCount;        #endregion        #region UI绑定参数        /// <summary>        /// 发送数量        /// </summary>        public int SendCount        {            get { return sendCount; }            set { sendCount = value; RaisePropertyChanged(); }        }        /// <summary>        /// 接收数量        /// </summary>        public int ReceiveCount        {            get { return receiveCount; }            set { receiveCount = value; RaisePropertyChanged(); }        }        /// <summary>        /// 接收区16进制        /// </summary>        public bool ReceiveFormat16        {            get { return receiveFormat16; }            set { receiveFormat16 = value; RaisePropertyChanged(); }        }        /// <summary>        /// 接收区数据        /// </summary>        public string DataReceiveInfo        {            get { return dataReceiveInfo; }            set { dataReceiveInfo = value; RaisePropertyChanged(); }        }        /// <summary>        /// 发送数据        /// </summary>        public string SendData        {            get            {                return sendData;            }            set { sendData = value; RaisePropertyChanged(); }        }        /// <summary>        /// 发送区16进制        /// </summary>        public bool SendFormat16        {            get { return sendFormat16; }            set { sendFormat16 = value; RaisePropertyChanged(); }        }        #endregion        #region 串口参数信息        /// <summary>        /// 开关        /// </summary>        public bool IsOpen        {            get { return isOpen; }            set { isOpen = value; RaisePropertyChanged(); }        }        /// <summary>        /// 数据位        /// </summary>        public int DataBit        {            get { return dataBit; }            set { dataBit = value; RaisePropertyChanged(); }        }        /// <summary>        /// 波特率        /// </summary>        public int BaudRdate        {            get { return baudRdate; }            set { baudRdate = value; RaisePropertyChanged(); }        }        /// <summary>        /// 端口        /// </summary>        public Port Port        {            get { return port; }            set { port = value; RaisePropertyChanged(); }        }        /// <summary>        /// 校验        /// </summary>        public CheckMode CheckMode        {            get { return checkMode; }            set { checkMode = value; RaisePropertyChanged(); }        }        /// <summary>        /// 停止位        /// </summary>        public StopBit StopBit        {            get { return stopBit; }            set { stopBit = value; RaisePropertyChanged(); }        }        /// <summary>        /// COM        /// </summary>        public SerialPort SerialPort        {            get { return serialPort; }            set { serialPort = value; RaisePropertyChanged(); }        }        #endregion        #region 串口操作方法        /// <summary>        /// 开启串口        /// </summary>        /// <returns></returns>        public bool Open()        {            if (serialPort != null && serialPort.IsOpen)            {                return Close();            }            try            {                serialPort = new SerialPort();                serialPort.DataBits = this.DataBit;                serialPort.StopBits = ComHelper.GetStopBits(this.StopBit.ToString());                serialPort.Parity = ComHelper.GetParity(this.CheckMode.ToString());                serialPort.PortName = this.Port.ToString();                serialPort.RtsEnable = true;                serialPort.DataReceived += SerialPort_DataReceived;                serialPort.Open();                if (serialPort.IsOpen)                    return IsOpen = true;                else                    return IsOpen = false;            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }            return IsOpen = false;        }        /// <summary>        /// 关闭串口        /// </summary>        /// <returns></returns>        public bool Close()        {            try            {                if (serialPort.IsOpen)                {                    serialPort.Close();                    return IsOpen = serialPort.IsOpen;                }                else                {                    return IsOpen = serialPort.IsOpen;                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);                return IsOpen = false;            }        }        /// <summary>        /// 发送数据        /// </summary>        public void Send()        {            if (SendFormat16)            {                byte[] bytes = CRC.StringToHexByte(SendData);                this.SerialPort.Write(bytes, 0, bytes.Length);                SendCount = bytes.Length; //不做增量            }            else            {                this.SerialPort.Write(SendData);                SendCount = SendData.Length;            }            Messenger.Default.Send("", "PlaySendFlashing");        }        /// <summary>        /// 清空接收区        /// </summary>        public void Clear()        {            this.DataReceiveInfo = string.Empty;        }        /// <summary>        /// 清空发送区和缓存区        /// </summary>        public void ClearText()        {            this.SendData = string.Empty;            this.SendCount = 0;            this.ReceiveCount = 0;        }        #endregion        /// <summary>        /// 返回事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            Messenger.Default.Send("", "PlayReciveFlashing");            byte[] readBuffer = new byte[SerialPort.ReadBufferSize];            SerialPort.Read(readBuffer, 0, readBuffer.Length);            ReceiveCount = SerialPort.ReceivedBytesThreshold; //不做增量            if (ReceiveFormat16)            {                //不做增量                DataReceiveInfo = CRC.ByteToString(readBuffer, true);            }            else            {                DataReceiveInfo = Encoding.ASCII.GetString(readBuffer);            }        }    }

核心MainViewModel类

作用: 关联首页的上下文, 通过DataContext绑定, 关联界面元素、命令等作用。

public class MainViewModel : ViewModelBase    {        /// <summary>        /// Initializes a new instance of the MainViewModel class.        /// </summary>        public MainViewModel()        {            ComParameterConfig = new ComParameterConfig();            CurrentParameter = new CurrentParameter();        }        private ComParameterConfig comParameter;        /// <summary>        /// 参数类        /// </summary>        public ComParameterConfig ComParameterConfig        {            get { return comParameter; }            set { comParameter = value; RaisePropertyChanged(); }        }        private CurrentParameter currentParameter;        /// <summary>        /// 当前配置参数        /// </summary>        public CurrentParameter CurrentParameter        {            get { return currentParameter; }            set { currentParameter = value; RaisePropertyChanged(); }        }        #region Command        private RelayCommand _ToOpen;        public RelayCommand ToOpen        {            get            {                if (_ToOpen == null)                {                    _ToOpen = new RelayCommand(Open);                }                return _ToOpen;            }            set            {                _ToOpen = value;            }        }        /// <summary>        /// 根据配置打开端口        /// </summary>        public void Open()        {            this.CurrentParameter.Open();        }        private RelayCommand _ToClick;        public RelayCommand ToClick        {            get            {                if (_ToClick == null)                {                    _ToClick = new RelayCommand(Click);                }                return _ToClick;            }            set            {                _ToClick = value;            }        }        /// <summary>        /// 发送数据        /// </summary>        public void Click()        {            this.CurrentParameter.Send();        }        private RelayCommand _ToClear;        public RelayCommand ToClear        {            get            {                if (_ToClear == null)                {                    _ToClear = new RelayCommand(Clear);                }                return _ToClear;            }            set            {                _ToClear = value;            }        }        /// <summary>        /// 清空接收区        /// </summary>        public void Clear()        {            this.CurrentParameter.Clear();        }        private RelayCommand _ToClearText;        public RelayCommand ToClearText        {            get            {                if (_ToClearText == null)                {                    _ToClearText = new RelayCommand(ClearText);                }                return _ToClearText;            }            set            {                _ToClearText = value;            }        }        /// <summary>        /// 清空界面值        /// </summary>        public void ClearText()        {            this.CurrentParameter.ClearText();        }        #endregion    }

CRC校验核心类

作用:主要实现数据校验, 含ModbusCR标准校验

/// <summary>    /// CRC校验    /// </summary>    public class CRC    {        #region  CRC16        public static byte[] CRC16(byte[] data)        {            int len = data.Length;            if (len > 0)            {                ushort crc = 0xFFFF;                for (int i = 0; i < len; i++)                {                    crc = (ushort)(crc ^ (data[i]));                    for (int j = 0; j < 8; j++)                    {                        crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);                    }                }                byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置                byte lo = (byte)(crc & 0x00FF);         //低位置                return new byte[] { hi, lo };            }            return new byte[] { 0, 0 };        }        #endregion        #region  ToCRC16        public static string ToCRC16(string content)        {            return ToCRC16(content, Encoding.UTF8);        }        public static string ToCRC16(string content, bool isReverse)        {            return ToCRC16(content, Encoding.UTF8, isReverse);        }        public static string ToCRC16(string content, Encoding encoding)        {            return ByteToString(CRC16(encoding.GetBytes(content)), true);        }        public static string ToCRC16(string content, Encoding encoding, bool isReverse)        {            return ByteToString(CRC16(encoding.GetBytes(content)), isReverse);        }        public static string ToCRC16(byte[] data)        {            return ByteToString(CRC16(data), true);        }        public static string ToCRC16(byte[] data, bool isReverse)        {            return ByteToString(CRC16(data), isReverse);        }        #endregion        #region  ToModbusCRC16        public static string ToModbusCRC16(string s)        {            return ToModbusCRC16(s, true);        }        public static string ToModbusCRC16(string s, bool isReverse)        {            return ByteToString(CRC16(StringToHexByte(s)), isReverse);        }        public static string ToModbusCRC16(byte[] data)        {            return ToModbusCRC16(data, true);        }        public static string ToModbusCRC16(byte[] data, bool isReverse)        {            return ByteToString(CRC16(data), isReverse);        }        #endregion        #region  ByteToString        public static string ByteToString(byte[] arr, bool isReverse)        {            try            {                byte hi = arr[0], lo = arr[1];                return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, 16).ToUpper().PadLeft(4, '0');            }            catch (Exception ex) { throw (ex); }        }        public static string ByteToString(byte[] arr)        {            try            {                return ByteToString(arr, true);            }            catch (Exception ex) { throw (ex); }        }        #endregion        #region  StringToHexString        public static string StringToHexString(string str)        {            StringBuilder s = new StringBuilder();            foreach (short c in str.ToCharArray())            {                s.Append(c.ToString("X4"));            }            return s.ToString();        }        #endregion        #region  StringToHexByte        private static string ConvertChinese(string str)        {            StringBuilder s = new StringBuilder();            foreach (short c in str.ToCharArray())            {                if (c <= 0 || c >= 127)                {                    s.Append(c.ToString("X4"));                }                else                {                    s.Append((char)c);                }            }            return s.ToString();        }        private static string FilterChinese(string str)        {            StringBuilder s = new StringBuilder();            foreach (short c in str.ToCharArray())            {                if (c > 0 && c < 127)                {                    s.Append((char)c);                }            }            return s.ToString();        }        /// <summary>        /// 字符串转16进制字符数组        /// </summary>        /// <param name="hex"></param>        /// <returns></returns>        public static byte[] StringToHexByte(string str)        {            return StringToHexByte(str, false);        }        /// <summary>        /// 字符串转16进制字符数组        /// </summary>        /// <param name="str"></param>        /// <param name="isFilterChinese">是否过滤掉中文字符</param>        /// <returns></returns>        public static byte[] StringToHexByte(string str, bool isFilterChinese)        {            string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str);            //清除所有空格            hex = hex.Replace(" ", "");            //若字符个数为奇数,补一个0            hex += hex.Length % 2 != 0 ? "0" : "";            byte[] result = new byte[hex.Length / 2];            for (int i = 0, c = result.Length; i < c; i++)            {                result[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);            }            return result;        }        #endregion    }

WPF技术点:

自定义样式按钮

<Style x:Key="CommonButtonBase" TargetType="{x:Type Button}">                <Setter Property="BorderBrush" Value="Transparent"/>                <Setter Property="BorderThickness" Value="0"/>                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>                <Setter Property="HorizontalContentAlignment" Value="Center"/>                <Setter Property="VerticalContentAlignment" Value="Center"/>                <Setter Property="Padding" Value="1"/>                <Setter Property="Cursor" Value="Hand"/>                <Setter Property="Template">                    <Setter.Value>                        <ControlTemplate TargetType="{x:Type Button}">                            <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}"                                             CornerRadius="4"                                            BorderThickness="{TemplateBinding BorderThickness}"                                             Background="{TemplateBinding Background}"                                             SnapsToDevicePixels="true">                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"                                               Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"                                               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"                                               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>                            </Border>                            <ControlTemplate.Triggers>                                <Trigger Property="IsEnabled" Value="False">                                    <Setter Property="Background" Value="#000000"/>                                    <Setter Property="Opacity" Value="0.1"/>                                </Trigger>                                <Trigger Property="IsMouseOver" Value="true">                                    <Setter Property="Foreground" Value="#FFFF00"/>                                </Trigger>                                <Trigger Property="IsMouseOver" Value="false">                                    <Setter Property="Foreground" Value="White"/>                                </Trigger>                            </ControlTemplate.Triggers>                        </ControlTemplate>                    </Setter.Value>                </Setter>            </Style>                    <Style TargetType="{x:Type Button}" x:Key="Btn0093EABase" BasedOn="{StaticResource CommonButtonBase}">                <Setter Property="Background" Value="#0093EA"/>                <Setter Property="Foreground" Value="White"/>                <Setter Property="FontSize" Value="22"/>                <Setter Property="Height" Value="40"/>                <Setter Property="Margin" Value="5"/>            </Style>

转换器用于绑定按钮

public class FontConverters : IValueConverter    {        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)        {            if (value != null && bool.TryParse(value.ToString(), out bool result))            {                if (result)                {                    return "关闭串口";                }            }            return "打开串口";        }        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)        {            throw new NotImplementedException();        }    }
//用于绑定UI的颜色状态显示    public class ColorConverters : IValueConverter    {        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)        {            if (value != null && bool.TryParse(value.ToString(), out bool result))            {                if (result)                {                    return new SolidColorBrush((Color)System.Windows.Media.ColorConverter.ConvertFromString("#2E8B57"));                }            }            return new SolidColorBrush((Color)System.Windows.Media.ColorConverter.ConvertFromString("#FF6347"));        }        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)        {            throw new NotImplementedException();        }    }

引用字体

   <TextBlock Text="&#xe6e4;" Margin="20 5 0 5" FontFamily="pack://application:,,,/Font/#iconfont"                                    Foreground="White" FontSize="30" VerticalAlignment="Center"/>

绑定命令和元素

<TextBlock Text="端     口:"  Style="{DynamicResource TxtComStyle}"/>                        <ComboBox  Grid.Row="0" Grid.Column="2" Style="{StaticResource ComboBoxStyle}" SelectedItem="{Binding CurrentParameter.Port}"                                  ItemsSource="{Binding ComParameterConfig.Port}"                                   />                        <TextBlock Text="波 特 率:" Style="{DynamicResource TxtComStyle}"/>                        <ComboBox  Grid.Row="0" Grid.Column="2" Style="{StaticResource ComboBoxStyle}" SelectedItem="{Binding CurrentParameter.BaudRdate}"                                   ItemsSource="{Binding ComParameterConfig.BaudRate}"                                   />                        <TextBlock Text="数 据 位:" Style="{DynamicResource TxtComStyle}"/>                        <ComboBox  Grid.Row="0" Grid.Column="2" Style="{StaticResource ComboBoxStyle}"  SelectedItem="{Binding CurrentParameter.DataBit}"                                   ItemsSource="{Binding ComParameterConfig.DataBit}"                                   />                        <TextBlock Text="校 验 位:" Style="{DynamicResource TxtComStyle}"/>                        <ComboBox  Grid.Row="0" Grid.Column="2" Style="{StaticResource ComboBoxStyle}"  SelectedItem="{Binding CurrentParameter.CheckMode}"                                   ItemsSource="{Binding ComParameterConfig.CheckMode}"                                   />                        <TextBlock Text="停 止 位:" Style="{DynamicResource TxtComStyle}"/>                        <ComboBox  Grid.Row="0" Grid.Column="2" Style="{StaticResource ComboBoxStyle}"  SelectedItem="{Binding CurrentParameter.StopBit}"                                   ItemsSource="{Binding ComParameterConfig.StopBit}"                                   />                        <TextBlock Text="状     态:" Style="{DynamicResource TxtComStyle}"/>                        <TextBlock Text="&#xe692;" Style="{DynamicResource TxtComStyle1}"  Foreground="{Binding CurrentParameter.IsOpen,Converter={StaticResource ColorConverters}}" />

写在最后

主项目的结构图 , 如下:

C#如何实现串口调试工具

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: C#如何实现串口调试工具

本文链接: https://lsjlt.com/news/321466.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#如何实现串口调试工具
    C#如何实现串口调试工具,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前文由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个...
    99+
    2023-06-29
  • C#实现串口调试工具
    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本的也很多, 功能扩展的很开也多。所以现在...
    99+
    2024-04-02
  • Linux系统中串口调试工具怎么用
    这篇文章主要介绍了Linux系统中串口调试工具怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实验环境:OS: Ubuntu16.04 Kernel: 4.4.0mini...
    99+
    2023-06-27
  • Flutter:如何在Android中实现串口通信调试
            本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。 1、引入依赖         在flutter工程的pubspec.yaml文件中引入flutter_libserialpo...
    99+
    2023-08-31
    android flutter 串口 dart
  • socket调试工具、socket调试软件、tcp调试工具、tcp调试软件(sokit),C#sokit工具包及其sokit使用说明
    sokit真的非常好用,可做服务端,可做客户端 sokit是一款非常简单易用的tcp、udp调试工具,主要适用于专业的网络管理使用,它可以轻松查看网内的数据情况,能够有效地接收、发送、转发TCP或UDP数据包。 一、TCP调试说明   1...
    99+
    2023-08-31
    tcp/ip 网络 服务器
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • 如何使用Chrome Firefox自带调试工具调试javascript
    这篇文章主要介绍了如何使用Chrome Firefox自带调试工具调试javascript,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们...
    99+
    2024-04-02
  • 使用python+Pyqt5实现串口调试助手
    python可以利用serial模块来和串口设备进行485或者232通讯。 当然,网上这类串口调试助手的小程序有很多,不过这些程序要么是要收费,只能试用30天,要么是不好用。 况且...
    99+
    2024-04-02
  • C#串口通信工具类的封装
    本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下  1、SerialPortHelper串口工具类封装 using System; using S...
    99+
    2024-04-02
  • restful接口规范与postman调试工具实例分析
    这篇“restful接口规范与postman调试工具实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们...
    99+
    2024-04-02
  • PyQt5+serial模块实现一个串口小工具
    目录串口简述serial模块参数方法使用模板串口工具示例串口简述 异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用...
    99+
    2023-01-13
    PyQt5 serial串口工具 PyQt5 串口工具 PyQt5 serial串口 PyQt5 serial串口
  • C#如何实现接口base调用
    今天小编给大家分享一下C#如何实现接口base调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。背景在三年前发布的C#8.0...
    99+
    2023-07-02
  • C#如何实现Windows服务测试与调试
    这篇文章主要为大家展示了“C#如何实现Windows服务测试与调试”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何实现Windows服务测试与调试”这篇文章吧。一、测试Windows服务为...
    99+
    2023-06-29
  • C#中如何使用远程调试和远程部署工具
    标题:C#中远程调试和远程部署工具的使用技巧摘要:本文将介绍如何在C#开发中使用远程调试和远程部署工具。通过远程调试,您可以在另一台计算机上调试代码,而无需在本地机器上运行整个应用程序。远程部署工具则可以帮助您将应用程序部署到远程服务器上。...
    99+
    2023-10-22
    远程调试 C#编程 远程部署
  • C#中如何使用断言和调试工具定位问题
    C#中如何使用断言和调试工具定位问题在C#开发过程中,经常会遇到程序出现错误的情况,这时候我们需要用到断言(assertions)和调试工具(debugging tools)来帮助我们定位问题并及时修复。通过合理地使用这些工具,我们可以提高...
    99+
    2023-10-22
    调试工具 断言 定位问题。
  • 如何在python中使用Birdseye调试工具
    这篇文章将为大家详细讲解有关如何在python中使用Birdseye调试工具,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Birdseye是一个Python调试器,它在函数调用中记录表达式的...
    99+
    2023-06-15
  • C#串口通信工具类的封装方法
    本篇内容介绍了“C#串口通信工具类的封装方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、SerialPortHelper串...
    99+
    2023-06-29
  • Linux测试工具netstat如何配置及实现
    这篇文章主要介绍Linux测试工具netstat如何配置及实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络...
    99+
    2023-06-16
  • 如何使用C#实现串口示波器
    这篇文章主要为大家展示了“如何使用C#实现串口示波器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C#实现串口示波器”这篇文章吧。具体内容如下开发工具visual studio2019C...
    99+
    2023-06-29
  • cypress中丰富的调试工具如何使用
    这篇文章主要讲解了“cypress中丰富的调试工具如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“cypress中丰富的调试工具如何使用”吧!cypress调试工具Cypress附带了...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作