C#winform中串口调试助手界面的设计

        下面总结下利用winform设计串口调试助手,如果错误的地方,望大家批评指正。

        首先附上项目工程代码方便大家自取:链接:https://pan.baidu.com/s/1m3veGA5_hJ2-BRFRvHyOGQ?pwd=1eo5 
提取码:1eo5

        以下的内容均学习自下方链接,如有文章有描述不清的地方,可点击视频链接看详细教程:

【单片机课/毕设利器】B站最小白的串口调试助手教程上位机C#编程

        一、串口调试助手的界面设计

        整个串口界面中,我们需要串口号、波特率、数据位、停止位、校验位。接收窗口(用于接收外界信息),发送窗口(向外界发送信息),本项目中除了串口号和波特率进行修改,其他直接使用系统默认的方式。

        默认格式如下:

        1、点击最上方菜单栏项目-->添加窗体应用--->类名命名Form5.cs(这里大家随意就行)

        2、添加各类控件,设计好界面

        ①在工具箱栏搜索Serial,将串口添加到界面中

        ②方法类似,继续添加button、label、TextBox、Radiobutton中,并如下布置好界面

        ③为了方便修改我们的控件,这里先更改各个控件的ID号。

        任意选择某控件-->点击属性-->设计--->更改Name栏里的内容

        二、代码的实现

        先双击空白页进入初始化

        ①先定义一个扫描可用端口的类,方便我们得知有几个端口可用,代码如下

private void ReflashPortToComboBox(SerialPort serialPort, ComboBox comboBox)
        { 
            if(!serialPort.IsOpen)//串口处于关闭状态
            {
                comboBox.Items.Clear();
                string[] str = SerialPort.GetPortNames();
                if(str == null)
                {
                    MessageBox.Show("本机没有串口!", "Error");
                    return;
                }
                //添加串口
                foreach (string s in str)
                {
                    comboBox.Items.Add(s);
                    Console.WriteLine(s);
                }
            }
            else
            {
                MessageBox.Show("串口处于打开状态不能刷新串口列表", "Error");
            }
        }

        ②初始化界面中调用ReflashPortToComboBox函数,并添加GB2312类型,使我们在之后的串口发送中获取中文字符

public Form5()
        {
            InitializeComponent();
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");
            //防止跨线程操作控件异常
            Control.CheckForIllegalCrossThreadCalls = false;//取消跨线程检查
            
        }

        ③在端口按钮中也添加ReflashPortToComboBox,方面后期的串口刷新

private void button1_Click(object sender, EventArgs e)
        {     
            ReflashPortToComboBox(serialPort1, comboBox_port);
        }

        ④在波特率的下拉宽-->属性-->数据-->选中Item-->点击后在里面添加波特率

        ⑤编辑打开串口代码

//端口号打开按钮
        private void button_Open_Click(object sender, EventArgs e)
        {
            Int32 iBaudRate = Convert.ToInt32(comboBox_BaudRate.Text);//获取下拉宽中的波特率,并从字符串转换为Int32
            serialPort1.PortName = comboBox_port.SelectedItem.ToString();//串口号
            serialPort1.BaudRate = iBaudRate;//波特率
            try 
            {
                serialPort1.Open();
                button_Open.Enabled = false;
                button_Close.Enabled = true;
            }
            catch(Exception ex)
            {
                MessageBox.Show("串口打开失败" + ex, "error");
            }
        }

        ⑥编辑关闭串口按钮

private void button_Close_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close();
                button_Open.Enabled = true;
                button_Close.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("串口关闭失败" + ex, "error");
            }
        }

        ⑦清空接收窗及清空发送窗

        //清空接收窗
        private void button4_Click(object sender, EventArgs e)
        {
            textBox_Get.Clear();
        }
        //清空发送窗
        private void button6_Click(object sender, EventArgs e)
        {
            textBox_Send.Clear();
        }

        ⑧编辑发送数据发送按钮

private void button2_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen)
            {
                if(textBox_Send.Text!="")
                {
                    if(radioBt_SendAscll.Checked == true)
                        try
                        {
                            serialPort1.Write(textBox_Send.Text);
                        }
                        catch(Exception ex)
                        {
                            MessageBox.Show(ex.Message, "串口数据写入错误");
                            serialPort1.Close();
                            button_Open.Enabled = true;
                            button_Close.Enabled = false;
                        }
                    else
                    {
                        try
                        {
                            string hexData = textBox_Send.Text.Replace(" ", "");
                            byte[] buffer = new byte[hexData.Length / 2];
                            for (int i = 0; i < buffer.Length; i++)
                            {
                                buffer[i] = Convert.ToByte(hexData.Substring(i * 2, 2), 16);
                            }
                            serialPort1.Write(buffer, 0, buffer.Length);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "串口数据写入错误");
                            serialPort1.Close();
                            button_Open.Enabled = true;
                            button_Close.Enabled = false;
                        }                         
                    }
                }
            }
        }

        ⑨编辑串口接收,单击serial1控件-->选择事件-->点击DataReceived进入串口接收函数编辑

 //串口接收事件
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            DateTime dt = DateTime.Now;
            try
            {
                if(radioBt_GetAscll.Checked)//如果接收的是字符
                {
                    string content = serialPort1.ReadExisting() + " " + dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";//读取从机数据
                    textBox_Get.AppendText(content);//将数据添加到文本
                }
                else//如果接收的是HEX模式
                {
                    
                    // 接收到数据后的处理逻辑
                   int i_InNum;//输入缓冲区中字节数
                   i_InNum = serialPort1.BytesToRead;

                   Byte[] ReceivedData = new Byte[serialPort1.BytesToRead];//创建接收字节数组
                    serialPort1.Read(ReceivedData, 0, ReceivedData.Length);//读取接收的数据
                    String RecvDataText = null;
                    for (int i = 0; i < ReceivedData.Length; i++)
                    {
                        RecvDataText += (ReceivedData[i].ToString("X2")+" ");
                    }
                    textBox_Get.Text += RecvDataText + dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
                    }
            }
            catch(Exception ex)
            {
                MessageBox.Show("数据接受出错" + ex, "error");
            }
        }

        三、演示

            最后进行效果的演示

       

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 14:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 14:34:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 14:34:01       82 阅读
  4. Python语言-面向对象

    2024-01-25 14:34:01       91 阅读

热门阅读

  1. Mysql 文件导入与导出

    2024-01-25 14:34:01       62 阅读
  2. 再学微信小程序

    2024-01-25 14:34:01       42 阅读
  3. Shell编程

    2024-01-25 14:34:01       59 阅读
  4. 【Python基础入门篇】基本函数——os与sys模块

    2024-01-25 14:34:01       57 阅读
  5. [MSSQL]自定义函数之从字符串提取数字

    2024-01-25 14:34:01       58 阅读
  6. 考研机试 链表合并

    2024-01-25 14:34:01       42 阅读
  7. 编程笔记 html5&css&js 051 CSS表格2-2

    2024-01-25 14:34:01       48 阅读
  8. nestjs之适配器模式的应用

    2024-01-25 14:34:01       63 阅读
  9. 编程笔记 html5&css&js 054 CSS默认值

    2024-01-25 14:34:01       49 阅读