C# 串口调试助手

本方法,禁用跨进程错误(做法不太好,但是对于单片机出身的人来说,好理解,能用就行)。

基本功能:

1.点串口号的下拉菜单自动当前检索设备管理器的COM

2.发送模式可选,hex和string两种

3.接收显示模式,hex和string两种

4.发送多行数据

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.Windows.Forms;

namespace SerialTools
{
    public partial class Form1 : Form
    {
        private long RxCount = 0;
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        #region 初始化Form
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Image = Properties.Resources.off;

            ////查询当前有用的串口号
            //SerialPort.GetPortNames();

            //string[] ports = SerialPort.GetPortNames();
            //foreach (string port in ports)
            //{
            //    cb_com.Items.Add(port);
            //}

            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = (StopBits)1;

            //迭代所有的波特率
            string[] tab_Baud = new string[] { "110", "300", "600", "1200", "2400", "4800", "9600", "14400", "19200", "38400", "56000", "57600", "115200", "128000", "256000" };
            foreach (string str in tab_Baud)
            {
                cb_Baud.Items.Add(str);
            }

            //迭代所有的数据位
            string[] tab_data = new string[] { "5", "6", "7", "8" };
            foreach (string str in tab_data)
            {
                cb_DataBits.Items.Add(str);
            }

            //迭代所有的停止位
            string[] tab_stop = new string[] { "1", "2" };
            foreach (string str in tab_stop)
            {
                cb_StopBits.Items.Add(str);
            }

            cb_Baud.Text = "9600";
            cb_DataBits.Text = "8";
            cb_StopBits.Text = "1";

            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//添加事件

        }
        #endregion

        #region 接收数据
        private void port_DataReceived(object sender,SerialDataReceivedEventArgs e) {
            if (!checkBox_receiveMode.Checked)//没有勾选hex时候,按照字符串方式读取
            {
                string str = serialPort1.ReadExisting();//字符串方式读
                textBox_receive.AppendText(str);    //添加内容
                RxCount += str.Length;

            }
            else {
                byte data;
                data = (byte)serialPort1.ReadByte();
                string str = Convert.ToString(data, 16).ToUpper();
                textBox_receive.AppendText((str.Length == 1 ? "0" + str : str)+" ");//空位补"0"
                RxCount += str.Length;
            }
            label_ReceiveCount.Text = RxCount.ToString();
        }
        #endregion

        #region 清空接收计数器和接收显示区域
        private void button4_Click(object sender, EventArgs e)
        {
            textBox_receive.Text = "";
            RxCount = 0;
            label_ReceiveCount.Text = RxCount.ToString();
        }
        #endregion

        #region 打开/关闭串口
        private void button1_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.PortName = cb_com.Text;
                    serialPort1.BaudRate = Convert.ToInt32(cb_Baud.Text);
                    serialPort1.DataBits = Convert.ToInt32(cb_DataBits.Text);
                    serialPort1.StopBits = (StopBits)Convert.ToInt32(cb_StopBits.Text);
                    serialPort1.Open();
                }
                catch
                {
                    MessageBox.Show("端口打开失败", "错误");

                }
            }
            else {
                try
                {
                    serialPort1.Close();
                }
                catch
                {
                    MessageBox.Show("端口关闭失败", "错误");

                }
            }

            changeButtonTextAndPicture();

        }
        #endregion

        #region 根据串口状态切换按键名称和指示灯图片
        private void changeButtonTextAndPicture()
        {
            if (serialPort1.IsOpen)
            {
                pictureBox1.Image = Properties.Resources.on;
                button1.Text = "关闭串口";
            }
            else
            {
                pictureBox1.Image = Properties.Resources.off;
                button1.Text = "打开串口";
            }
        }
        #endregion

        #region 多行发送
        private void button2_Click(object sender, EventArgs e)
        {
            byte[] Data = new byte[1];
            if (serialPort1.IsOpen)
            {
                if(textBox_send1.Text != "")
                {
                    if(!checkBox_sendMode.Checked)//发送模式是字符模式
                    {
                        try
                        {
                            serialPort1.Write(textBox_send1.Text);
                        }
                        catch
                        {
                            MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
                            serialPort1.Close();//关闭串口
                        }
                    }
                    else
                    {
                        if(textBox_send1.Text.Length%2 == 0)//偶数个数字
                        {
                            for(int i = 0; i < textBox_send1.Text.Length / 2; i++)
                            {
                                try
                                {
                                    Data[0] = Convert.ToByte(textBox_send1.Text.Substring(i * 2, 2), 16);
                                }
                                catch
                                {
                                    MessageBox.Show("请核对输入的十六进制数据格式", "错误");

                                }

                                try
                                {
                                    serialPort1.Write(Data, 0, 1);
                                }
                                catch
                                {
                                    MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
                                    serialPort1.Close();//关闭串口
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("请输入偶数个16进制数字", "错误");
                        }
                    }
                }
            }
        }
        #endregion

        #region 单行发送
        private void button3_Click(object sender, EventArgs e)
        {
            byte[] Data = new byte[1];
            if (serialPort1.IsOpen)
            {
                if (textBox_send2.Text != "")
                {
                    if (!checkBox_sendMode.Checked)//发送模式是字符模式
                    {
                        try
                        {
                            serialPort1.Write(textBox_send2.Text);
                            if (checkBox_newLine.Checked)
                                serialPort1.Write("\r\n");
                        }
                        catch
                        {
                            MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
                            serialPort1.Close();//关闭串口
                        }
                    }
                    else
                    {
                        if (textBox_send2.Text.Length % 2 == 0)//偶数个数字
                        {
                            for (int i = 0; i < textBox_send2.Text.Length / 2; i++)
                            {
                                try
                                {
                                    Data[0] = Convert.ToByte(textBox_send2.Text.Substring(i * 2, 2), 16);
                                }
                                catch
                                {
                                    MessageBox.Show("请核对输入的十六进制数据格式", "错误");

                                }

                                try
                                {
                                    serialPort1.Write(Data, 0, 1);
                                    if (checkBox_newLine.Checked)
                                        serialPort1.Write("\r\n");

                                }
                                catch
                                {
                                    MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
                                    serialPort1.Close();//关闭串口
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("请输入偶数个16进制数字", "错误");
                        }
                    }
                }
            }
        }
        #endregion

        #region 切换选项时候修改串口属性
        private void cb_com_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                    serialPort1.PortName = cb_com.Text;
                    serialPort1.Open();
                }
                else
                {
                    serialPort1.PortName = cb_com.Text;
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                changeButtonTextAndPicture();
            }
        }

        private void cb_Baud_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.BaudRate = int.Parse(cb_Baud.Text);
        }

        private void cb_DataBits_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.DataBits = int.Parse(cb_DataBits.Text);
        }

        private void cb_StopBits_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.StopBits = (StopBits)int.Parse(cb_StopBits.Text);
        }
        #endregion

        #region com的下拉菜单展开时候自动搜索当前设备管理器
        private void cb_com_DropDown(object sender, EventArgs e)
        {
            cb_com.Items.Clear();       //清空
            //查询当前有用的串口号
            SerialPort.GetPortNames();

            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                cb_com.Items.Add(port);
            }
        }
        #endregion
    }
}

工程源码下载(使用VS2015编译):

http://yunpan.cn/cHLTVtXLL6UYs  访问密码 bf4e

时间: 2024-08-08 01:28:26

C# 串口调试助手的相关文章

新一代优秀串口助手-小蜂串口调试助手

小蜂串口调试助手Ver1.0是非常好用的串口调试工具,可以实现的功能包括发送接收16进制数.字符串,另所有拥有目前领先其它串口工具独有功能,可以在一个窗口上显示两个串口界面.无须安装,直接使用,界面简洁,清晰,操作简单.适宜单片机编程时对RS232的通讯和测试以及所有有串口工作. 在使用小蜂串口助手之前,必须先安装Microsoft.NET Framework 4.5.exe或以上版本软件,微软官方网站下载地址:http://www.microsoft.com/net/ 百度网盘下载地址: ht

用Tkinter实现一个串口调试助手

2020年元旦,武汉出现了不明原因肺炎,搞得人心惶惶,只好宅在家里.闲着也是闲着,于是把很久之前用python写的一个串口调试助手再修改一下. 简单说明一下: 以前是准备在debian系统里调试单片机用的,基于python 2.6,GUI是用自带Tkinter做的,不用安装第三方库. 修改了之后,可以跨linux.windows平台(我没有MacOS系统,只能放弃),python 2.6/2.7/3.7都简单测试了一下,暂时只能说都可以用. 只实现了基本功能,没有自动发送.发送文件.保存等功能,

串口调试助手,VB6.0开发

1.为什么要自己开发一个串口调试助手 通常我们都是:在网上直接下载一个串口助手,可执行文件,直接使用,并无法得到其源码,在此我们提供了一个VB6.0开发的串口助手: (1)让你极速掌握串口开发的要点: (2)提供源码,并且源代码中有详细注释: (3)极速开发出上位机,并与下位机(单片机)等通讯: (4)使用自己的串口助手,高大上 支持的功能: (1)支持串口设置:串口号,波特率,校验位,数据位,停止位 (2)支持字符格式发送和接收 (3)支持十六进制格式发送和接收 (4)支持将接收到的数据保存到

[转]web串口调试助手,浏览器控制串口设备

本文转自:https://blog.csdn.net/ldevs/article/details/39664697 打开串口时查找可用串口供选择 通过javascript调用activex控制串口收发数据,可以通过轮询每个串口状态找到指定的设备,简化用户操作 选择并打开串口 function selcomport(){if ($("#btnOpen").val() == "关闭串口") { closeCom(); $("#btnOpen").va

串口调试助手

一直想开发一款串口调试助手软件,更确切的说是需要了解串口调试助手怎样设计的. 最近做windows串口编程时搜索到一些开源的,简单记录如下: 1. https://github.com/movsb/common win32平台串口调试助手 https://blog.twofei.com/566/ 开发语言:C++ 2. https://github.com/Neutree/COMTool 跨平台串口调试助手 开发语言:python,基于QT 3. 无界面跨平台go库 https://github

Delphi - 采用第三方控件TMS、SPComm开发串口调试助手

第三方控件TMS.SPComm的下载与安装 盒子上可搜索关键字进行下载,TMS是.dpk文件,SPComm.pas文件: 安装方法自行百度,不做赘述. 通过TMS控件进行界面布局 界面预览: Delphi通过SPComm连接串口.发送和接收指令 连接串口 拖一个TComm控件到主窗体上,选中控件,单击F11,完成如下配置. 这里主要是将一些布尔类型的属性设置成False,其他属性在前台连接按钮事件下动态设置. 连接代码如下,这里需要特别主意一下: 当串口参数超过COM9(即COM10.COM11

BLE蓝牙4.0串口调试助手

支持HEX和文本发送接收,仅175K  无广告 无高级权限 APK下载地址:http://pan.baidu.com/s/1gdk20dP IOS版敬请期待... 版权声明:本文为博主原创文章,未经博主允许不得转载.

[STM32F10x] 使用printf函数进行串口调试问题

硬件:STM32F103C8T6 平台:Keil ARM-MDk V5.11 利用printf函数通过串口(USART)进行调试时遇到的一个问题: printf("Hello, Mini-M3"); 本意是想输出"Hello, Mini-M3",但是通过串口调试助手,得到的输出是"ello, Mini-M3",也就是第一个数据没有接收到,而且这种情况只会在初始化USART后第一次 发送数据时出现. USART发送数据的代码如下: int fput

2015.8.3stm32f4串口调试记录

由于最近要做一个IRIGB的转码模块,需要从GPS模块获取时间数据,处理器和GPS采用串口通信的方式.由于串口通信用得太多,就直接上手将串口的配置代码写完,然后试着用串口发送一个字符‘2‘,然后通过PC上的串口调试助手,可以看到我收到的是一个’向上的箭头‘.于是问题来了,对于我这个单片机玩了都不玩的人来说,这似乎有点弱智,可是我调了一下午也没发现什么端倪,因为,这个代码确实是比较简单.最后没有办法只有用百度去搜搜类似的问题,百度上答案无非都是在说是时钟配置问题,但是这一点我似乎不太相信.因为之前