C#串口调试助手

3 篇文章 0 订阅
订阅专栏

2020年春节,因新冠病毒疫情,难得的空闲时间,自学了一下C#。之前一直在做单片机,所以就用C#写了个串口调试助手来练习一下。

先看一下效果图:
串口调试助手
SerialAssistant.exe
链接:https://pan.baidu.com/s/1_Lti0i0nlYbSBYJ9Fe4AwQ
提取码:msvg

完整工程文件下载

下面附上主要代码:
窗体加载事件

	private void frmMainForm_Load(object sender, EventArgs e)
        {
            btnSend.Enabled = false;
            this.MinimumSize = this.Size;
            //搜索计算机串口号
            cmbPort.Items.AddRange(SerialPort.GetPortNames());
            if (cmbPort.Items.Count > 0)
            {
                cmbPort.SelectedIndex = 0;
            } 
            //波特率            
            cmbBaudRate.Items.Add("300");
            cmbBaudRate.Items.Add("600");
            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.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.Items.Add("1.5");
            cmbStopBit.Items.Add("2");
            cmbStopBit.SelectedIndex = 0;             
            //校验位           
            cmbParity.Items.Add("None");
            cmbParity.Items.Add("Even");
            cmbParity.Items.Add("Odd");
            cmbParity.SelectedIndex = 0;          
            lblMark.Text = "";              //显示串口状态Mark            
            chkDTR.Enabled = false;
            chkDSR.Enabled = false;
            chkRTS.Enabled = false;
            chkCTS.Enabled = false;           
            timer2.Interval = 1;            //下位机响应时间计时,时间间隔1ms
            timer3.Interval = 100;          //DSR/CTS线状态检测时间            
            //创建ProgramLogs.txt文本文件,记录发送过的数据
            FileStream F = new FileStream("ProgramLogs.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
            F.Close();
            StreamReader sR = new StreamReader("ProgramLogs.txt");      //实例化StreamReader,读取ProgramLogs.txt
            string nextLine;
            while ((nextLine = sR.ReadLine()) != null)
            {
                cmbDataLogs.Items.Add(nextLine);        //Add读取的数据
                cmbDataLogs.SelectedIndex = 0;
            }
            sR.Close();
            txtSendData.Text = "";
            CheckForIllegalCrossThreadCalls = false;
            ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);     //绑定串口接收事件  
        }				

打开串口

	/// <summary>        
        /// 打开串口        
        /// </summary>       
        /// <param name="sender"></param>        
        /// <param name="e"></param>  
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (cmbPort.Items.Count <= 0)       //判断计算机是否存在串口
            {
                MessageBox.Show("计算机没有发现串口,请检查!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (ComDevice.IsOpen == false)      //如果串口未打开
            {
                //根据选择设置串口参数
                ComDevice.PortName = cmbPort.SelectedItem.ToString();
                ComDevice.BaudRate = Convert.ToInt32(cmbBaudRate.SelectedItem.ToString());
                ComDevice.Parity = (Parity)Convert.ToInt32(cmbParity.SelectedIndex.ToString());
                ComDevice.DataBits = Convert.ToInt32(cmbDataBits.SelectedItem.ToString());
                ComDevice.StopBits = (StopBits)Convert.ToInt32(cmbStopBit.SelectedItem.ToString());
                try
                {
                    ComDevice.Open();           //打开串口
                    btnSend.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    lblMark.Text = "ERR";
                    lblMark.ForeColor = Color.Red;
                    return;
                }
                btnOpen.Text = "关闭串口";
                lblMark.Text = "OK";
                lblMark.ForeColor = Color.Green;
                //在状态栏显示串口状态
                toolStripStatusLabel1.Text = cmbPort.SelectedItem.ToString() + " OPENED , " + cmbBaudRate.SelectedItem.ToString() + " , " + cmbDataBits.SelectedItem.ToString() + " , " + (Parity)Convert.ToInt32(cmbParity.SelectedIndex.ToString()) + " , " + cmbStopBit.SelectedItem.ToString();
                toolStripStatusLabel1.ForeColor = Color.Green;
                chkDTR.Enabled = true;
                chkDSR.Enabled = true;
                chkRTS.Enabled = true;
                chkCTS.Enabled = true;
            }
            else
            {
                try
                {
                    ComDevice.Close();          //关闭串口
                    btnSend.Enabled = false;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                btnOpen.Text = "打开串口";
                lblMark.Text = "";
                //在状态栏显示串口状态
                toolStripStatusLabel1.Text = cmbPort.SelectedItem.ToString() + " CLOSED";
                toolStripStatusLabel1.ForeColor = Color.Red;
                chkDTR.Enabled = false;
                chkDSR.Enabled = false;
                chkRTS.Enabled = false;
                chkCTS.Enabled = false;
            }
            cmbPort.Enabled = !ComDevice.IsOpen;
            cmbBaudRate.Enabled = !ComDevice.IsOpen;
            cmbParity.Enabled = !ComDevice.IsOpen;
            cmbDataBits.Enabled = !ComDevice.IsOpen;
            cmbStopBit.Enabled = !ComDevice.IsOpen;
        }

发送button事件

	/// <summary>        
        /// 发送button事件        
        /// </summary>        
        /// <param name="sender"></param>        
        /// <param name="e"></param> 
        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] sendData = null;
            if (radSendHEX.Checked)
            {
                sendData = strToHexByte(txtSendData.Text.Trim());
            }
            else if (radSendASCII.Checked)
            {
                sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());
            }
            else if (radSendUTF.Checked)
            {
                sendData = Encoding.UTF8.GetBytes(txtSendData.Text.Trim());
            }
            else if (radSendUNI.Checked)
            {
                sendData = Encoding.Unicode.GetBytes(txtSendData.Text.Trim());
            }
            else
            {
                sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());
            }
            if (SendData(sendData))
            {
                timer2.Enabled = true;      //开启定时器2,计时下位机响应时间
                timer2.Start();
                toolStripStatusLabel6.Text = (int.Parse(toolStripStatusLabel6.Text) + sendData.Length).ToString();      //状态栏提示发送的字节数
            }
            else
            {
                //MessageBox.Show("数据发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if (cmbDataLogs.Items.Count != 0)
            {
                bool f = false;
                foreach (string data in cmbDataLogs.Items)      //如果发送的数据没有记录,记录
                {
                    if (data == txtSendData.Text)
                    {
                        f = true;
                    }
                }
                if (!f)
                {
                    cmbDataLogs.Items.Add(txtSendData.Text);
                    StreamWriter sW = new StreamWriter(Application.StartupPath + "\\ProgramLogs.txt", true);
                    sW.WriteLine(txtSendData.Text);
                    sW.Close();
                }
            }
            else
            {
                cmbDataLogs.Items.Add(txtSendData.Text);
                cmbDataLogs.SelectedIndex = 0;
                StreamWriter sW = new StreamWriter(Application.StartupPath + "\\ProgramLogs.txt", true);
                sW.WriteLine(txtSendData.Text);
                sW.Close();
            }
        }

串口发送数据

	/// <summary>       
        /// 发送数据        
        /// </summary>        
        /// <param name="sender"></param>        
        /// <param name="e"></param>        
        public bool SendData(byte[] data)
        {
            if (ComDevice.IsOpen)
            {
                try
                {
                    if (radSendHEX.Checked)
                    {
                        ComDevice.Write(data, 0, data.Length);      //HEX发送数据   
                    }
                    else
                    {
                        ComDevice.Write(txtSendData.Text);          //string发送数据
                    }
                    return true;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return false;
        }
        /// <summary>        
        /// 字符串转换16进制字节数组        
        /// </summary>        
        /// <param name="hexString"></param>        
        /// <returns></returns>       
        private byte[] strToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
            return returnBytes;
        }

串口接收数据

	/// <summary>        
        /// 接收数据        
        /// </summary>        
        /// <param name="sender"></param>        
        /// <param name="e"></param>        
        private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            toolStripStatusLabel9.Text = Convert.ToString(responseTime);    //状态提示下位机响应时间
            timer2.Stop();
            timer2.Enabled = false;
            responseTime = 0;
            if (ComDevice.IsOpen)
            {
                byte[] ReDatas = new byte[ComDevice.BytesToRead];
                ComDevice.Read(ReDatas, 0, ReDatas.Length);         //读取数据            
                AddData(ReDatas);       //输出数据         
            }
            else
            {
                MessageBox.Show("请先打开串口");
            }
        }

将接收的数据显示到接收区

	/// <summary>        
        /// 添加数据        
        /// </summary>        
        /// <param name="data"></param>         
        public void AddData(byte[] data)
        {
            if (radReceiveHEX.Checked)
            {
                StringBuilder sb = new StringBuilder();     //实例化StringBuilder
                for (int i = 0; i < data.Length; i++)
                {
                    sb.AppendFormat("{0:x2}" + " ", data[i]); //十六进制显示,不足补0
                }
                AddContent(sb.ToString().ToUpper());
            }
            else if (radReceiveASCII.Checked)
            {
                AddContent(new ASCIIEncoding().GetString(data));
            }
            else if (radReceiveUTF.Checked)
            {
                AddContent(new UTF8Encoding().GetString(data));
            }
            else if (radReceiveUNI.Checked)
            {
                AddContent(new UnicodeEncoding().GetString(data));
            }
            else
            {
                AddContent(new ASCIIEncoding().GetString(data));
            }
            toolStripStatusLabel3.Text = (int.Parse(toolStripStatusLabel3.Text) + data.Length).ToString();      //状态栏提示接收的字节数
        }
        /// <summary>        
        /// 输入到显示区域        
        /// </summary>        
        /// <param name="content"></param>        
        private void AddContent(string content)
        {
            if (!pauseDisplay)
            {
                BeginInvoke(new MethodInvoker(delegate
                {
                    if (chkAutoLine.Checked && txtReceivedData.Text.Length > 0)
                    {
                        txtReceivedData.AppendText("\r\n");
                    }
                    txtReceivedData.AppendText(content);
                }));	//这里是使用委托刷新控件的显示,初学的话这里可能有些难以理解
            }
        }

初学C#,分享一下我的第一个C#程序,有不足之处还望各位大侠不吝指教!

C#串口调试软件(CRC校验)
03-24
基友大傻串口调试工具开发的源码,采用c#语言编写,CRC校验功能。
C#实现的CRC工具源码
09-19
C#实现的CRC工具模块,使用查表算法。 简单易用,可直接引用在程序中,实现CRC校验功能。 组院内含完整源代码
c# 开发串口调试助手 Visual Studio 2019
最新发布
2301_76792852的博客
03-22 1235
串口调试助手是用于在开发、测试和调试串口通信应用程序时进行串口数据的监视和交互的工具。
c#串口通信+CRC校验
05-30
(菜鸟级)串口通信+CRC校验,之前很久写的VS2010版本。实践无毛病。
C# 串口调试助手源码程序
07-18
C# 串口调试助手,工程源码程序,VS2017版本,包括打包程序
C#串口调试助手源码.rar_C#串口调试助手源码_串口助手_串口助手 C_串口助手源码_串口调试助手C
07-15
基于C#串口调试助手源码,供大家学习参考,也当自己备份!
C# 串口通讯 串口调试助手源码
SabreWulf
04-25 9512
工业控制类软件,Windows平台使用C#语言既方便又快捷。在工控领域,串口通讯又是极其常见的需求。于是抽时间写了一个通用的串口调试助手工具,并将工控调试中常用的功能集成在上面,方便调试。源码已在gitee上开源,界面使用wpf实现,源码地址:BYSerial: Microsoft Windows 串口调试助手 (gitee.com)https://gitee.com/LvYiWuHen/byserial简单介绍一下已实现的功能。 程序功能主要分为四大块: 1.串口通讯 2.TCP通讯......
c#winform串口助手源码
weixin_51192760的博客
05-25 3255
c# winform 串口助手源码
C#串口调试助手.rar
12-19
首先这是用C#写的一个串口助手,和其他博主一样,像串口号,波特率,数据位,校验位等等这些都有,与CSDN其他博主不同的是,这可以自动检测串口号,有“联系我们”的网址超链接,实现滚动条始终在最下面和一键清空接收和发送的文本框等等。
C#写个串口助手
QtCompany的博客
04-20 585
最后,在serialPort_DataReceived事件处理程序中,我们从串口读取数据并将其追加到receiveTextBox控件中。在窗体加载时,我们将可用的波特率、奇偶校验位、数据位和停止位添加到相应的ComboBox控件中,并将可用的串口号添加到portNameComboBox控件中。如果串口未打开,则使用选择的端口名称、波特率、奇偶校验位、数据位和停止位打开串口。在发送按钮的Click事件处理程序中,我们从sendTextBox控件中获取要发送的文本。在窗体关闭时,如果串口已经打开,则关闭串口。
C#串口助手源码.zip
11-14
winfom框架GUI界面,源码参考学习使用。
C# 串口和以太网通讯超级调试助手 源代码
11-08
C# 串口和以太网通讯超级调试助手 源代码,很实用,是不错的学习资料。
调试助手源码,C#写的通讯助手源码(串口,网口)
09-10
C#写的通讯助手源码(串口,网口)
串行通信串口助手C#源码
03-19
1.常见的串口 (1)RS-232接口:通常适合于数据传输频率在0~20000bps范围的通信。在PC机上通常都是COM串口。 不足:抗干扰能力差,通信距离短,速率低。 (2)RS-422/485接口:传输速度和通信距离变得非常远(1200m),并且在一条平衡总线上连接最多10个接收器。 2.串行通信的基本参数 (1)波特率:是指串行通信中每1秒所传送的数据位数,单位是bps。也就是传输速度。 比如发送一个字符需要8位,如果波特率是4800bps传输,则每秒可以传输600个字符。 (2)起始位:起始位表示字符传输的开始。在通信线上,没有数据传输时处于逻辑“1”状态。当发送一个字符 数据时,首先发出一个“0”信号,这个逻辑低电平就是起始位。接收设备检测到低电平后,就准备开始接收。 (3)数据位:当接收设备收到起始位后,紧挨着的就是数据位,数据位的个数可以是5、6、7、8位。 在字符串数据传送的过程中,数据位从最低有效位开始传输。 (4)奇偶校验位:数据位发送完以后,就可以发送奇偶校验位,用于有限差错的检查。通信双方需要约定
Modbus调试工具 C#源码
03-24
Modbus上位机调试软件是一个针对Modbus RTU及TCP协议下数据调试软件,可以方便的切换为串口、TCP-Server、TCP-Client三种模式应用,通过选择应用方式,调节应用参数(COM口、波特率、数据位、校验位、停止位、IP地址、端口号)来完成从不同工况下的Modbus协议的解析及测试。软件可以按照寄存器地址方便的查看对应的十进制数值、二进制数值、十六进制数值,可方便的查看对比状态量、开关量、模拟量的实时值。 Modbus上位机调试软件同时支持数据的写入,根据协议将换算好的数值写入相应的寄存器即可,调试助手仅支持单个寄存器写入,同理可以完成遥控命令的测试功能。
Serial-debugging-assistant.rar_串口 消费者_串口助手_生产者
07-14
基于生产者和消费者的串口调试助手,供初学者参考
C#中的WinFrom技术实现串口通讯助手(附源码)
易冰亦寒的博客
03-18 1505
using System; using System.Drawing; using System.IO; // 导入输入输出文件框 using System.IO.Ports; // 串口模块 using System.Text; using System.Windows.Forms; namespace MainSender { // 解决线程访问问题 public delegate void SerialPortEventHandler(Object sender, Seria
C#编写串口助手
fxq19980406的博客
05-06 616
最终打开效果,(单片机的程序简单写了一个,上位机的程序编写完用作测试)附C#源码单片机源码和代码解释,请大家多多批评指正。所使用的单片机为STC89C52。
MODBUS调试工具 C#源码:开发、实现与应用
GPXziO的博客
09-14 480
源码中,作者对MODBUS协议的解析和调试实现了高度的抽象和封装,使得开发者可以方便地进行MODBUS协议的调试。为了方便开发者进行MODBUS协议的调试,本文将介绍一种基于C#语言开发的MODBUS调试工具,该工具支持RTU、TCP、UDP三种模式,并适用于不同版本的Visual Studio和开发环境。本文详细阐述了基于C#语言开发的MODBUS调试工具的源码实现,该工具包含MODBUS主站调试工具和MODBUS从站调试工具,支持RTU、TCP、UDP三种模式。二、MODBUS调试工具的设计与实现。
c# 串口调试助手
09-17
C#串口调试助手是一个用于串口通信的工具,可以用来接收和发送串口数据。你可以根据通信协议来开发上位机控制硬件和查看硬件的状态。在Visual Studio的C#开发环境中,你可以使用SerialPort类来实现串口通信。通过监听串口接收事件,你可以接收到从串口接收到的数据,并进行相应的处理。在你提供的代码片段中,Com_DataReceived方法就是用来接收串口数据的函数。在这个方法中,你可以添加你自己的处理逻辑来处理接收到的数据。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • C#串口调试助手 1960
  • C#常用的命名规则 1812
  • C#常用控件属性及方法介绍 1104
  • STM32 CAN 通信(一) 690

分类专栏

  • STM32 1篇
  • C#编程学习 3篇

最新评论

  • C#串口调试助手

    changsons: 连到系统上的设备没有发挥作用 是什么原因?同样的设备用友善串口调试工具可以

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • STM32 CAN 通信(一)
  • C#常用控件属性及方法介绍
  • C#常用的命名规则
2021年1篇
2020年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源八门神器ios凤凰卫视给姓罗的年宝宝起名大全束缚之影信用风险敞口铠甲勇士刑天后传八字缺木水怎么起名字冲动是魔鬼youjizzlive微信起名大全有财运八画的字起名字内存不兼容舒字起名 女孩神兽退散稻草人书屋赤焰战场1德字起名女装时尚店铺起名公司起名含金含水的美甲美睫 店起名字生辰八字五行起名原则鼠年起哪些名字好呢在异界的魔徒鼠宝宝起名的园林公司起什么名好用宝宝吉祥起名大全真正免费起名字开店起名奇隆广西大学回应女生安全攻略51avi淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化