打印
[技术问答]

C#制作串口助手源码

[复制链接]
2871|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mmbs|  楼主 | 2023-7-27 08:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

WinFormSeriport.zip (88.05 KB)
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 WinFormSeriport
{
    public partial class FORM1 : Form
    {
        SerialPort sp = new SerialPort();
        
        public FORM1()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            sp.Close();
            lbl_TxRx.Text = "Tx:" +0+" " + "Rx:" + 0;
        }
        private void Form1_Load_1(object sender, EventArgs e)
        {
            Timer_SendDate.Interval = 1000;
            Timer_SendDate.Stop();
        }

        
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            lbl_Move.Text = e.X.ToString() + " " + e.Y.ToString();
        }

      

        private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {
            MessageBox.Show("接收数据时发生未知错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btn_OpenSerial_Click(object sender, EventArgs e)
        {
            if (sp.IsOpen == false)
            {
                btn_OpenSerial.Text = "开启串口";
                try
                {
                    sp.PortName = comboBox_Com.Text;
                    sp.BaudRate = Convert.ToInt32(comboBox_Bot.Text);
                    sp.Parity = (System.IO.Ports.Parity)Enum.Parse(typeof(System.IO.Ports.Parity), comboBox_Parity.Text);
                    sp.DataBits = Convert.ToInt16(comboBox_DateBit.Text);
                    sp.StopBits = (System.IO.Ports.StopBits)Enum.Parse(typeof(System.IO.Ports.StopBits), comboBox_StopBit.Text);
                    sp.Encoding = Encoding.Default;    //设置串口编码为default:获取操作系统的当前 ANSI 代码页的编码。
                    sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived);

                    sp.Open();    //开启串口
                    if (checkBox_ClearShow.Checked)   //如果开启了自动清空功能
                        Timer_SendDate.Start();

                    btn_OpenSerial.Text = "关闭串口";
                }
                catch
                {
                    MessageBox.Show("配置串口出错,检查各项参数是否设置!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                btn_OpenSerial.Text = "关闭串口";
                try
                {
                    sp.Close();

                    btn_OpenSerial.Text = "开启串口";
                    MessageBox.Show("串口已关闭!","提示",MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("出现未知错误,串口关闭失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);      
                }
            }

        }
        string receiveData;
        UInt32 receiveBytesCount;
        string sendData;
        UInt32 sendBytesCount;
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            receiveData = sp.ReadExisting();
            receiveBytesCount += (UInt32)receiveData.Length;


            //字符串显示
            if (checkBox_ClearShow.Checked == false)
            {
                if (checkBox_16Show.Checked == false)   //hex 方式显示
                {
                    richtxtbox_ShowGetNumber.AppendText(receiveData);
                    richtxtbox_ShowGetNumber.Focus();   //让光标到这来
                    richtxtbox_ShowGetNumber.Select(richtxtbox_ShowGetNumber.TextLength, 0);
                    this.richtxtbox_ShowGetNumber.ScrollToCaret(); //设置光标到最后
                }
                //16进制显示
                else
                {
                    byte[] recData = System.Text.Encoding.Default.GetBytes(receiveData);// 将接受到的字符串据转化成数组;  

                    foreach (byte str in recData)
                    {
                        richtxtbox_ShowGetNumber.AppendText(string.Format("{0:X2} ", str));
                    }
                }
            }
            lbl_TxRx.Text = "Tx:" + sendBytesCount.ToString()+" " + "Rx:" + receiveBytesCount.ToString();
        }


        private void btn_GetCom_Click(object sender, EventArgs e)  //自动获取串口号
        {
            string[] serialPortName = System.IO.Ports.SerialPort.GetPortNames();

            foreach (string name in serialPortName)
            {
                comboBox_Com.Text = name;
            }
        }

        private void btn_Send_Click(object sender, EventArgs e)
        {
            if (sp.IsOpen == false)
            {
                btn_OpenSerial.Text = "开启串口";
                MessageBox.Show("请打开串口!", "错误",MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                btn_OpenSerial.Text = "关闭串口";
                if (checkBox_SendByItself.Checked)
                {
                    Timer_SendDate.Interval = Convert.ToInt32(textBox_SendTime.Text);
                    Timer_SendDate.Start();
                }
                sendData = richTextBox_Send.Text;
                if (checkBox_SendIn16.Checked == false)
                {
                    sp.Write(sendData);
                }
                else
                {
                    try
                    {
                        sendData.Replace("0x", "");   //去掉0x
                        sendData.Replace("0X", "");   //去掉0X
                        //  sendData.

                        string[] strArray = sendData.Split(new char[] { ',', ',', '\r', '\n', ' ', '\t' });
                        int decNum = 0;
                        int i = 0;
                        byte[] sendBuffer = new byte[strArray.Length];  //发送数据缓冲区

                        foreach (string str in strArray)
                        {
                            try
                            {
                                decNum = Convert.ToInt16(str, 16);
                                sendBuffer[i] = Convert.ToByte(decNum);
                                i++;
                            }
                            catch
                            {

                            }
                        }
                        sp.Write(sendBuffer, 0, sendBuffer.Length);

                        //更新发送数据计数
                        sendBytesCount += (UInt32)sendBuffer.Length;

                        lbl_TxRx.Text = "Tx:" + sendBytesCount.ToString()+" " + "Rx:" + receiveBytesCount.ToString();

                    }
                    catch
                    {

                    }
                }
            }
        }

        private void Timer_SendDate_Tick(object sender, EventArgs e)
        {

            if (checkBox_ClearShow.Checked)
                richtxtbox_ShowGetNumber.Text = null;

            sendData = richTextBox_Send.Text;
   
            if (sp.IsOpen)
            {
                btn_OpenSerial.Text = "关闭串口";
                if (checkBox_SendByItself.Checked)
                {
                    if (checkBox_SendIn16.Checked == false)
                    {
                        sp.Write(sendData);
                    }
                    else
                    {
                        try
                        {
                            sendData.Replace("0x", "");   //去掉0x
                            sendData.Replace("0X", "");   //去掉0X
                            //  sendData.

                            string[] strArray = sendData.Split(new char[] { ',', ',', '\r', '\n', ' ', '\t' });
                            int decNum = 0;
                            int i = 0;
                            byte[] sendBuffer = new byte[strArray.Length];  //发送数据缓冲区

      

                            foreach (string str in strArray)
                            {
                                try
                                {
                                    decNum = Convert.ToInt16(str, 16);
                                    sendBuffer[i] = Convert.ToByte(decNum);
                                    i++;
                                }
                                catch
                                {

                                }
                            }
                            sp.Write(sendBuffer, 0, sendBuffer.Length);

                        }
                        catch
                        {

                        }
                    }
                    //更新发送数据计数
                    sendBytesCount += (UInt32)sendData.Length;

                    lbl_TxRx.Text = "Tx:" + sendBytesCount.ToString()+" " + "Rx:" + receiveBytesCount.ToString();
                }
                else
                {
                 if (checkBox_ClearShow.Checked)
                    checkBox_SendByItself.CheckState=CheckState .Unchecked ;
                else
                    Timer_SendDate.Stop();
                }
            }

            else
            {
                    btn_OpenSerial.Text = "开启串口";
                    Timer_SendDate.Stop();
                    MessageBox.Show("串口已经关闭!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);      
            }
        
        }

        private void btn_ClearAll_Click(object sender, EventArgs e)
        {
            richtxtbox_ShowGetNumber.Text = null;
            richTextBox_Send.Text = null;
        }
    }
}


使用特权

评论回复
沙发
zerorobert| | 2023-8-7 16:15 | 只看该作者
用C#写的串口通信程序的源代码,就像串口调试助手那种软件

使用特权

评论回复
板凳
vivilyly| | 2023-8-7 16:25 | 只看该作者
在使用串口通信时,可能会遇到各种异常情况,例如读写超时、数据错误等。需要注意的是,需要在代码中处理这些异常情况,以保证程序的健壮性和稳定性。

使用特权

评论回复
地板
pmp| | 2023-8-7 16:49 | 只看该作者
怎么实现串口发送文件的               

使用特权

评论回复
5
cashrwood| | 2023-8-7 17:14 | 只看该作者
如何使用C#编写串口程序?               

使用特权

评论回复
6
jkl21| | 2023-8-7 17:36 | 只看该作者
串口通信通常需要使用多线程来实现数据的发送和接收。在源码中要注意线程安全,避免多个线程同时访问串口资源导致的竞态条件和数据混乱问题。

使用特权

评论回复
7
tifmill| | 2023-8-7 17:57 | 只看该作者
在源码中要考虑到这些异常情况,并进行适当的异常处理,以确保程序的稳定性和可靠性。

使用特权

评论回复
8
xiaoyaodz| | 2023-8-7 18:20 | 只看该作者
在源码中要实现相应的数据解析算法,将字节流转换为可读的数据格式。

使用特权

评论回复
9
updownq| | 2023-8-7 18:42 | 只看该作者
串口助手通常需要一个用户界面,用于显示接收到的数据、发送数据等操作。

使用特权

评论回复
10
pmp| | 2023-8-7 19:03 | 只看该作者
C#中有很多不同的串口库可供选择,例如SerialPort、ComPort、SerialPortEx等。选择合适的串口库可以帮助你更快地实现串口通信。

使用特权

评论回复
11
tabmone| | 2023-8-7 19:25 | 只看该作者
在使用完串口后,要及时释放相关的资源,如关闭串口、释放线程等,以避免资源泄露和系统性能下降。

使用特权

评论回复
12
timfordlare| | 2023-8-7 19:46 | 只看该作者
需要考虑线程同步的问题。               

使用特权

评论回复
13
yorkbarney| | 2023-8-7 20:09 | 只看该作者
用C#中的SerialPort写一个通信串口调试程序

使用特权

评论回复
14
rosemoore| | 2023-8-7 20:31 | 只看该作者
怎么实现利用C#编上位机程序,然后通过串口

使用特权

评论回复
15
usysm| | 2023-8-7 20:52 | 只看该作者
你可能需要解析接收到的数据,并根据约定的协议进行相应的处理。确保对接收到的数据进行正确解析和处理,以满足应用需求。

使用特权

评论回复
16
1988020566| | 2023-8-7 21:15 | 只看该作者
在使用串口通信时,需要注意保护自己的代码和数据

使用特权

评论回复
17
pl202| | 2023-8-7 21:37 | 只看该作者
需要在代码中添加串口助手的功能,例如读写串口数据、设置串口参数、显示串口通信日志等

使用特权

评论回复
18
minzisc| | 2023-8-7 21:59 | 只看该作者
建议使用异步方式进行数据传输。这样可以避免主线程阻塞,同时提高程序的响应性能。

使用特权

评论回复
19
wilhelmina2| | 2023-8-7 22:21 | 只看该作者
在实际使用串口时,要考虑到可能的异常情况,如设备拔出、通信异常等

使用特权

评论回复
20
backlugin| | 2023-8-7 22:42 | 只看该作者
求一套C#串口助手的源码               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

194

主题

6565

帖子

3

粉丝