c#学习----串口助手

主窗体及下的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication1
{
    public partial class 串口助手 : Form
    {
        public 串口助手()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
        }
        protected Boolean stop = false;
        protected Boolean conState = false;
        private int num = 0;
        private StringBuilder builder = new StringBuilder();
       

        private UInt32 tx, rx = 0,aa=0;

        SerialPort sp = new SerialPort();//实例化串口通讯类
        //以下定义4个公有变量,用于参数传递
        public static string strProtName = "";
        public static string strBaudRate = "";
        public static string strDataBits = "";
        public static string strStopBits = "";
        private void Form1_Load(object sender, EventArgs e)
        {
            // 端口未打开时
            groupBox1.Enabled = false;//发送区不可选
            groupBox2.Enabled = false;//接收区不可选
            groupBox3.Enabled = true;//默认定时发送不选中,功能区可用
            this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";
            this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";
            this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";
            this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";
            this.toolStripStatusLabel5.Text = "";



        }
        //串口设置按钮监听事件
        private void btnSetSP_Click_1(object sender, EventArgs e)
        {
            timer1.Enabled = false;//关闭计时器1
            sp.Close();//关闭当前串口

            Form2 dlg = new Form2();//打开串口设置窗口
            if (dlg.ShowDialog() == DialogResult.OK)//判断是否点击了串口设置窗口的确定按钮,在设置窗口的确定按钮监听下设置了DialogResult = DialogResult.OK;
            {//将串口设置窗口的参数传到串口的设置参数中
                sp.PortName = strProtName;//串口号
                sp.BaudRate = int.Parse(strBaudRate);//波特率
                sp.DataBits = int.Parse(strDataBits);//数据位
                sp.StopBits = (StopBits)int.Parse(strStopBits);//停止位
                sp.ReadTimeout = 500;//读取数据的超时时间,引发ReadExisting异常
            }
        }
        private void bntSwitchSP_Click(object sender, EventArgs e)
        {
            if (bntSwitchSP.Text == "打开串口")
            {
                if (strProtName != "" && strBaudRate != "" && strDataBits != "" && strStopBits != "")
                {
                    try
                    {
                        if (sp.IsOpen)
                        {
                            sp.Close();
                            sp.Open();//打开串口
                        }
                        else
                        {
                            sp.Open();//打开串口
                        }
                        bntSwitchSP.Text = "关闭串口";
                        groupBox1.Enabled = true;//发送区可选
                        groupBox2.Enabled = true;//接收区可选
                        this.toolStripStatusLabel1.Text = "端口号:" + sp.PortName + " | ";
                        this.toolStripStatusLabel2.Text = "波特率:" + sp.BaudRate + " | ";
                        this.toolStripStatusLabel3.Text = "数据位:" + sp.DataBits + " | ";
                        this.toolStripStatusLabel4.Text = "停止位:" + sp.StopBits + " | ";
                        this.toolStripStatusLabel5.Text = "";

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("错误:" + ex.Message, "C#串口通信");
                    }
                }
                else
                {
                    MessageBox.Show("请先设置串口!", "RS232串口通信");
                }
                sp.Encoding = Encoding.GetEncoding("GB2312");

                sp.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            }
            else
            {
                timer2.Stop();
                timer1.Enabled = false;
                timer2.Enabled = false;
                bntSwitchSP.Text = "打开串口";
                if (sp.IsOpen) sp.Close();

                groupBox1.Enabled = false;
                groupBox2.Enabled = false;
                this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";
                this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";
                this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";
                this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";
               // this.toolStripStatusLabel5.Text = "";
                this.toolStripStatusLabel6.Text = "接收:0"  + "   " + "发送:0" + " |";
               
            }
        }
      //定时发送
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (checkBox1_timer.Checked == false)
            {
                if (button1.Text == "关闭发送")
                {
                    if (num > 0)
                    {
                        num--;
                        textBox2.Text = Convert.ToString(num);
                        if (num == 0)
                            num = 0;
                        send();
                    }
                }
            }
            else
            {
                send();
            }
            
           
            
           
        }
        开启定时发送
        private void checkBox1_timer_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1_timer.Checked)
            {
                if (sp.IsOpen)
                {
                    try
                    {
                        groupBox3.Enabled = false;//定时发送选中,功能区不可用
                        timer2.Interval = Convert.ToInt32(textBox1.Text);

                        timer2.Start();  // 启动计时器, 默认不启动
                    }
                    catch (Exception ec)
                    {
                        MessageBox.Show(ec.Message);
                    }

                }
                else 
                {
                    MessageBox.Show("请打开串口");
                }

            } 关闭定时发送
            else// if (checkBox1_timer.Checked == false)
            {
               
                groupBox3.Enabled = true;//定时发送不选中,功能区可用
                timer2.Stop();
            }
        }
        /// <summary>
        /// 定时发送固定帧数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
          
                if (button1.Text == "开始发送")
                {
                    num = Convert.ToInt32(textBox2.Text);
                    if (num > 0)
                    {
                        timer2.Interval = Convert.ToInt32(textBox3.Text);
                        timer2.Start();//开启定时器发送数据
                    }
                    else
                    {
                        timer2.Stop();//关闭定时器
                        MessageBox.Show("帧数必须大于0", "提示");
                    }
                    button1.Text = "关闭发送";
                }
                else
                {

                    timer2.Stop();//关闭定时器
                    button1.Text = "打开发送";
                }
            
            

           
        }
        //清除发送
        private void button3_Click(object sender, EventArgs e)
        {
            txtSend.Clear();
        }
        //清除接收
        private void button4_Click(object sender, EventArgs e)
        {
            txtReceiveData.Clear();
        }
        //发送数据按键
        private void bntSendData_Click(object sender, EventArgs e)
        {
            send();

        }
        private void send()
        {
            if (sp.IsOpen)
            {
                if (hex_Send.Checked == true)//数值发送模式
                {
                    if (txtSend.Text != "")//发送输入框有内容
                    {
                        if (IsHex(txtSend.Text))//判断是否是16进制
                        {
                            try
                            {

                                byte[] data = new byte[1];
                                // MessageBox.Show(textBox2.Text.Length.ToString());      
                                for (int i = 0; i < txtSend.Text.Length / 2; i++)
                                {
                                    data[0] = Convert.ToByte(txtSend.Text.Substring(i * 2, 2).ToUpper(), 16);
                                    //MessageBox.Show(data[0].ToString());                           
                                    sp.Write(data, 0, 1);

                                }
                                if (txtSend.Text.Length % 2 != 0)
                                {
                                    data[0] = Convert.ToByte(txtSend.Text.Substring(txtSend.Text.Length - 1, 1).ToUpper(), 16);
                                    sp.Write(data, 0, 1);
                                }
                                tx += (UInt32)txtSend.Text.Length;
                                toolStripStatusLabel6.Text = "接收:" + rx.ToString() + "   " + "发送:" + tx.ToString() + " |";

                            }
                            catch
                            {
                                MessageBox.Show("请输入“0-9”“A-F”“a-f”", "提示");
                            }
                        }
                        else//发送输入框含有非16进制内容 转换成ascii 码发送
                        {

                            try
                            {
                                byte[] ascii = System.Text.Encoding.ASCII.GetBytes(txtSend.Text);//将当前内容转换成ascii码

                                sp.Write(ascii, 0, txtSend.Text.Length);
                                tx += (UInt32)txtSend.Text.Length;
                                toolStripStatusLabel6.Text = "接收:" + rx.ToString() + "   " + "发送:" + tx.ToString() + " |";

                            }
                            catch
                            {

                            }
                        }

                    }
                    else
                    { }/*发送框内无内容 等待用户输入*/
                }

                else//以字符模式发送
                {
                    if (txtSend.Text != "")
                    {

                        try
                        {
                            //System.Text.Encoding.Default utf8 = new System.Text.UTF8Encoding();
                            byte[] texts = System.Text.Encoding.Default.GetBytes(txtSend.Text);
                            sp.Write(texts, 0, texts.Length);
                            //  ComDevice.WriteLine(textBox2.Text);
                            tx += (UInt32)txtSend.Text.Length;
                            toolStripStatusLabel6.Text = "接收:" + rx.ToString() + "   " + "发送:" + tx.ToString() + " |";
                        }
                        catch
                        { }
                        // ComDevice.WriteLine(texts);
                    }
                    else
                    { }/*发送框内无内容 等待用户输入*/
                }
            }
            else
            {
                MessageBox.Show("请先打开串口!");
            }
        
        }

        
/// <summary>
/// 判断字符串是否是 16进制
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
       private bool IsHex(string str)
       {
           if (str == "") return false;
           const string PATTERN = @"[A-Fa-f0-9]+$";//正则匹配
           bool sign = false;
           for (int i = 0; i < str.Length; i++)
           {
               sign = System.Text.RegularExpressions.Regex.IsMatch(str[i].ToString(), PATTERN);
               if (!sign)
               {
                   return false;
               }
           }
           return true;
       }
        //接收事件
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           
            try
            {
                if (checkBox1.Checked)
                {
                    int n = sp.BytesToRead;
                    byte[] buf = new byte[n];
                    sp.Read(buf, 0, n);
                    builder.Clear();
                    rx += (UInt32)n;
                    foreach (byte i in buf)
                    {
                        builder.Append(i.ToString("x2") + " ");
                    }
                    txtReceiveData.AppendText(builder.ToString());
                    toolStripStatusLabel6.Text = "接收:" + rx.ToString() + "   " + "发送:" + tx.ToString() + " |";
                }
                else
                {
                    string str = sp.ReadExisting();
                    rx += (UInt32)str.Length;//获取接收字节数
                    // builder.Append(Encoding.Default.GetString(buf));              
                    // this.textBox1.AppendText(builder.ToString());                                           
                    toolStripStatusLabel6.Text = "接收:" + rx.ToString() + "   " + "发送:" + tx.ToString() + " |";

                 
                    this.txtReceiveData.AppendText(str);


                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        
    }
}

设置窗口的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //串口
            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                cmbPort.Items.Add(port);
                
            }
            cmbPort.SelectedIndex = 0;

            //波特率
            cmbBaudRate.Items.Add("110");
            cmbBaudRate.Items.Add("300");
            cmbBaudRate.Items.Add("1200");
            cmbBaudRate.Items.Add("2400");
            cmbBaudRate.Items.Add("4800");
            cmbBaudRate.Items.Add("9600");
            cmbBaudRate.Items.Add("19200");
            cmbBaudRate.Items.Add("38400");
            cmbBaudRate.Items.Add("57600");
            cmbBaudRate.Items.Add("115200");
            cmbBaudRate.Items.Add("230400");
            cmbBaudRate.Items.Add("460800");
            cmbBaudRate.Items.Add("921600");
            cmbBaudRate.SelectedIndex = 5;

            //数据位
            cmbDataBits.Items.Add("5");
            cmbDataBits.Items.Add("6");
            cmbDataBits.Items.Add("7");
            cmbDataBits.Items.Add("8");
            cmbDataBits.SelectedIndex = 3;

            //停止位
            cmbStopBit.Items.Add("1");
            cmbStopBit.SelectedIndex = 0;

            //佼验位
            cmbParity.Items.Add("无");
            cmbParity.SelectedIndex = 0;
        }
        private void bntOK_Click_1(object sender, EventArgs e)
        {
            //以下4个参数都是从窗体MainForm传入的
            串口助手.strProtName = cmbPort.Text;
            串口助手.strBaudRate = cmbBaudRate.Text;
            串口助手.strDataBits = cmbDataBits.Text;
            串口助手.strStopBits = cmbStopBit.Text;
            DialogResult = DialogResult.OK;
        }
      

       
          
        

        private void cmbPort_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void bntCancel_Click_1(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

       
    }
}

主窗体界面

 

设置窗口界面

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要编写一个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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值