C#串口调试助手

串口编程中需要用到一个非常重要的控件SerialPort

SerialPort几个比较重要属性

NAME 标识在代码中串口的名称
BaudRate 获取或设置串行波特率
DataBits 数据位长度
Parity 奇偶校验
StopBits 停止位

代码

Form1()

public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

下面这句必须加,为了避免线程间的错误 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls
= false;

Form1_Load 窗口加载函数

private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");
            comboBox2.Text = "115200";
            button2.Enabled = false;
        }

设置串口编码方式为GB2312 serialPort1.Encoding = Encoding.GetEncoding(“GB2312”) comboBOX2为串口波特率选择栏,默认波特率115200
button2为关闭串口按钮,默认不可以点击

serialPort1_DataReceived 串口接收函数

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//串口接收数据事件
        {
            //接收模式  数据
            if (radioButton1.Checked)//选择框,勾选则是ture 进入数据接收模式
            {
                byte[] data = new byte[serialPort1.BytesToRead];//定义一个数组,长度被接收的数据长度决定
                serialPort1.Read(data,0,data.Length);//从串口读数据到数组data 从0开始 偏移data.Length
                foreach (var item in data)//遍历数组data
                {
                    string str = Convert.ToString(item, 16).ToUpper();//将数组data中的数据转换成16进制的字符串,同时将字符串大写
                    if (str.Length == 1)//处理字符串,比如只接收到一个8,则处理成08
                    {
                        str = "0" + str;
                    }
                    textBox2.AppendText(str);//将处理之后的字符串显示到textBox2中,textBox2为接收数据显示栏
                }   
            }
            //接收模式  字符
            else
            {
                string str = serialPort1.ReadExisting();//直接将接收到的数据转换成字符串
                
                
                textBox2.AppendText(str);//显示字符串
               
            }
        }

radioButton1为勾选框

button1_Click 打开串口按钮

private void button1_Click(object sender, EventArgs e)//打开串口
        {
            try//提高程序的容错性
            {
                serialPort1.PortName = comboBox1.Text;//选择串口,comboBox1为串口选择栏
                serialPort1.BaudRate = int.Parse(comboBox2.Text);//选择波特率
                serialPort1.Open();//打开串口
                button1.Enabled = false;//串口打开按钮不可用
                button2.Enabled = true;//串口关闭可用
            }
            catch
            {
                MessageBox.Show("错误!","提示");
                serialPort1.Close();//记得出错要关闭串口
            }

        }

button2_Click 关闭串口按钮

private void button2_Click(object sender, EventArgs e)//关闭串口
        {
            try
            {
                serialPort1.Close();//关闭串口
                button1.Enabled = true;//串口打开按钮可用
                button2.Enabled = false;//串口关闭按钮不可用
            }
            catch
            {
                MessageBox.Show("错误","提示");
                serialPort1.Close();
            }
            
        }

button3_Click 串口发送数据按钮

private void button3_Click(object sender, EventArgs e)//发送数据
        {
            if(serialPort1.IsOpen && textBox1.Text != "")//检测串口是否打开并且发送栏是否为空
            {
                //发送模式  数据
                if(radioButton3.Checked)
                {
                    try
                    {
                        byte[] data = new byte[1];
                        string str = textBox1.Text;
                        str = str.Replace(" ", String.Empty);//处理准备发送得字符串,将空白字符,0X,0x删除掉
                        str = str.Replace("0X", String.Empty);
                        str = str.Replace("0x", String.Empty);

                        for (int i = 0; i < (str.Length - str.Length % 2) / 2; i++)
                        {
                            data[0] = Convert.ToByte(str.Substring(i * 2, 2), 16);
                            serialPort1.Write(data, 0, 1);
                        }
                        if (str.Length % 2 == 1)
                        {
                            data[0] = Convert.ToByte(str.Substring(str.Length - 1, 1), 16);
                            serialPort1.Write(data, 0, 1);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("错误", "提示");
                    }
                }
                //发送模式 字符
                else
                {
                    try
                    {
                        serialPort1.WriteLine(textBox1.Text);
                    }
                    catch
                    {
                        MessageBox.Show("错误","提示");
                        serialPort1.Close();
                        button1.Enabled = true;
                        button2.Enabled = false;
                    }
                }
            }
        }

textBox2_TextChanged自动下拉

private void textBox2_TextChanged(object sender, EventArgs e)
        {
             textBox2.Select(textBox2.Text.Length, 1);
             textBox2.ScrollToCaret();
        }

button4_Click 扫描串口按钮

private void button4_Click(object sender, EventArgs e)//扫描串口
        {
            for (int i = 1; i < 20; i++)
            {
                string str = "COM" + i.ToString();//遍历串口1到20
                serialPort1.PortName = str;
                try
                {
                    serialPort1.Open();//打开串口,注意,如果没有成功打开串口则会执行catch里面的语句
                    comboBox1.Items.Add(str);//将能够成功打开的给予comboBox1
                    serialPort1.Close();//最后再关闭串口
                }
                catch
                {
                    continue;
                }
            }
        }
    }

这里用了try catch语句 加上continue语句,如果不能成功打开串口则继续检测,一直检测到COM20

完整代码

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

namespace SerialPort
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");
            comboBox2.Text = "115200";
            button2.Enabled = false;
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//串口接收数据事件
        {
            //接收模式  数据
            if (radioButton1.Checked)
            {

                byte[] data = new byte[serialPort1.BytesToRead];
                serialPort1.Read(data,0,data.Length);
                foreach (var item in data)
                {
                    string str = Convert.ToString(item, 16).ToUpper();
                    if (str.Length == 1)
                    {
                        str = "0" + str;
                    }
                    textBox2.AppendText(str);
                }   
            }
            //接收模式  字符
            else
            {
                string str = serialPort1.ReadExisting();
                
                
                textBox2.AppendText(str);
               
            }
        }
        private void button1_Click(object sender, EventArgs e)//打开串口
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = int.Parse(comboBox2.Text);
                serialPort1.Open();
                button1.Enabled = false;
                button2.Enabled = true;
            }
            catch
            {
                MessageBox.Show("错误!","提示");
                serialPort1.Close();
            }

        }
        private void button2_Click(object sender, EventArgs e)//关闭串口
        {
            try
            {
                serialPort1.Close();
                button1.Enabled = true;
                button2.Enabled = false;
            }
            catch
            {
                MessageBox.Show("错误","提示");
                serialPort1.Close();
            }
            
        }
        private void button3_Click(object sender, EventArgs e)//发送数据
        {
            if(serialPort1.IsOpen && textBox1.Text != "")
            {
                //发送模式  数据
                if(radioButton3.Checked)
                {
                    try
                    {
                        byte[] data = new byte[1];
                        string str = textBox1.Text;
                        str = str.Replace(" ", String.Empty);
                        str = str.Replace("0X", String.Empty);
                        str = str.Replace("0x", String.Empty);

                        for (int i = 0; i < (str.Length - str.Length % 2) / 2; i++)
                        {
                            data[0] = Convert.ToByte(str.Substring(i * 2, 2), 16);
                            serialPort1.Write(data, 0, 1);
                        }
                        if (str.Length % 2 == 1)
                        {
                            data[0] = Convert.ToByte(str.Substring(str.Length - 1, 1), 16);
                            serialPort1.Write(data, 0, 1);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("错误", "提示");
                    }
                }
                //发送模式 字符
                else
                {
                    try
                    {
                        serialPort1.WriteLine(textBox1.Text);
                    }
                    catch
                    {
                        MessageBox.Show("错误","提示");
                        serialPort1.Close();
                        button1.Enabled = true;
                        button2.Enabled = false;
                    }
                }
            }
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
             textBox2.Select(textBox2.Text.Length, 1);
             textBox2.ScrollToCaret();
        }

        private void button4_Click(object sender, EventArgs e)//扫描串口
        {
            for (int i = 1; i < 20; i++)
            {
                string str = "COM" + i.ToString();
                serialPort1.PortName = str;
                try
                {
                    serialPort1.Open();
                    comboBox1.Items.Add(str);
                    serialPort1.Close();
                }
                catch
                {
                    continue;
                }
            }
        }
    }
}

VisualStudio工程文件

工程文件链接

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值