C#制作串口助手

 一、工程创建

        创建新项目,选择Windows窗体应用(.NET Framework),不选择Windows窗体应用,因为要使用.NET框架

 

 二、创建布局

        创建如下所示布局,选择左侧栏工具,里面有对应的控件,添加完后记得添加一个serialport控件,textbox框要显示下拉条则调整如图所示属性

         布局优化,将各个控件的Text属性重命名成如下所示,新增了一个扫描按钮(Button5),comboBox复选框属性调整成不可修改,这样运行时就不能在框里面写内容只能选择框内有的内容。

 三、代码编写

        编写代码时,注意需要从控件界面双击控件,进入控件相应的函数体内编写,不要直接将代码复制粘贴进去,复制粘贴过去的函数在配置文件内没有定义,即使名字一样也无法关联到控件。各个函数的解释已经在代码中详细解释了,可一一查看,具体细节不懂,百度搜索函数名即可。

3.1 页面初始化函数Form1

        在其中添加一个线程屏蔽函数,不要让程序运行时检查各个线程之间的冲突,因为打开一个新窗口就相当于创建了一个线程的子进程,子进程不能回头访问别的线程,会导致冲突。

 3.2 初始化扫描端口号

        双击页面布局中的窗口边框 ,进入窗体初始化函数,添加扫描串口函数,添加串口接收数据处理事件,禁用按钮3发送数据功能

        随后编写串口扫描函数和串口接收数据处理函数

 3.3 各个按钮的点击功能

         双击各个按钮,进入按钮对应函数

        扫描按钮:

         关闭端口按钮:

         打开端口按钮:

3.4 combomBox中添加波特率列表

        在布局页面中,按下图所示点击,写入相应波特率即可

 3.5 全部源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;



namespace ISxyq
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//屏蔽线程检查
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //扫描当前哪个串口是打开状态,初始化扫描
            SearchAndAddSerialToComboBox(serialPort1, comboBox1);
            //手动添加串口接收数据处理事件
            serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
            //禁用按钮3,因为初始化时消息内容为空,什么都发送不了
            button3.Enabled = false;
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口接收数据处理方法
        {
            if (!radioButton3.Checked)//如果接受模式为字符模式,非数值模式
            {
                string str = serialPort1.ReadExisting();//字符串方式读取
                textBox1.AppendText(str);//添加内容,相当于textBox1.Text = textBox1.Text+str;
            }
            else//如果接收模式为数值接收
            {
                byte data;  //定义一个8位整型变量,每次数据传输时就是传8位,用不到什么第九位奇偶校验
                data = (byte)serialPort1.ReadByte();//读取串口中的数据:读取到的是int类型的数据,需要进行一次转换。强转为byte类型,byte是8位,对应一个十六进制数,最终显示的也是十六进制数
                String str = Convert.ToString(data, 16).ToUpper();//将8位变量转换成16进制数(Convert.ToString)大写的形式(.ToUpper()),并且赋值给一个字符串
                textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");

            }
        }

        private void SearchAndAddSerialToComboBox(SerialPort Port, ComboBox Box)//端口扫描函数
        {
            string Buffer;                      //创建缓存区,用于存储扫描到的串口数量
            Box.Items.Clear();                //清空ComboBox内容,把上次扫描到的串口清除重新扫描
            for (int i = 1; i < 20; i++)
            {
                try                              //核心原理是依靠try和catch完成遍历,因为这样for循环才不会报错退出
                {
                    Buffer = "COM" + i.ToString();
                    Port.PortName = Buffer;       //控件serialport的PortName属性
                    Port.Open();                  //如果串口能打开,执行下一句,打不开,捕获异常,不执行下一句                  
                    Box.Items.Add(Buffer);        //将当前串口写入ComboBox的Items中
                    Port.Close();                 //关闭串口
                }
                catch{
                }
            }

        }

        private void button5_Click(object sender, EventArgs e)
        {
            SearchAndAddSerialToComboBox(serialPort1, comboBox1);//扫描串口
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Text = " ";//清除接收
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close();
                button1.Enabled = true;
                button2.Enabled = false;
            }
            catch
            {
                MessageBox.Show("串口关闭错误,请检查...", "错误");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close();
                serialPort1.PortName = comboBox1.Text;//端口名等于comboBox1中选中的端口
                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//波特率,十进制数据转换,将字符串类型的波特率转换成十进制数
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
            }
            catch
            {
                MessageBox.Show("端口错误,请检查串口", "错误");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] Data = new byte[1];          //只存储一个字节的数组
            if (serialPort1.IsOpen)//判断串口是否打开
            {
                if (textBox2.Text != "")  //判断发送域是否有数据
                {
                    if (!radioButton1.Checked)//以字符形式发送数据
                    {
                        try
                        {
                            serialPort1.WriteLine(textBox2.Text);//向串口中写入数据
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("串口写入数据错误", "错误");//向串口写入数据发生错误
                            serialPort1.Close(); //关闭串口
                            button1.Enabled = true;//打开串口按钮开启
                            button2.Enabled = false;//关闭串口按钮关闭
                        }
                    }
                    else//以数值形式发送数据
                    {    //比如输入0550A  ,前四位,05  50  最后一位, A
                        //防止用于输入的个数为奇数个,两个数字为一个十六进制数
                        for (int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i++)//处理前偶数个数字
                        {
                            Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);//将字符串转换为16进制的数值
                            serialPort1.Write(Data, 0, 1);//向串口中写入数据
                        }
                        if (textBox2.Text.Length % 2 != 0)//单独处理最后一个数字
                        {
                            //
                            Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);//最后一位=长度-1;
                            //发送数据
                            serialPort1.Write(Data, 0, 1);
                        }
                    }

                }
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.ScrollToCaret();//将文件内容滚动到当前输入位置
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            if (textBox2.Text == "")//如果当前框内没有内容
            {
                button3.Enabled = false;//不允许发送数据
            }
            else
            {
                button3.Enabled = true;
            }
        }
    }
}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要编写一个C#串口调试助手,你可以按照以下步骤进行开发: 1. 确定你想要实现的功能,并设计界面。你可以使用Visual Studio的Winform来创建一个窗体应用程序。\[1\] 2. 设置串口参数。在你的应用程序中,你需要设置串口的波特率、数据位、停止位和校验位等参数,以便与硬件进行通信。\[3\] 3. 编写事件处理器。根据你的设计,为每个组件编写相应的事件处理器。例如,当点击发送按钮时,你需要将文本框中的数据发送出去。确保你清楚每个组件会触发什么事件,并实现相应的功能。\[3\] 4. 进行测试和调试。在编写完每个组件的事件处理器后,及时编译和运行你的应用程序,以便及早发现和解决问题。\[3\] 通过按照以上步骤进行开发,你可以编写一个简单的C#串口调试助手。如果你想学习更多关于Winform的知识,你可以点击链接学习。\[2\] #### 引用[.reference_title] - *1* *2* [C#开发串口调试助手的详细教程](https://blog.csdn.net/weixin_49959955/article/details/123653122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C#实现【串口助手】【入门级别】【小白进】](https://blog.csdn.net/qq_43535543/article/details/127702042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值