C#SerialPort串口通信知识点

本文介绍了一位C#新手在进行SerialPort串口通信练习时遇到的速度问题,并分享了通过自行编写串口封装类来提升数据传输速率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先:作为C#新人,在练习SerialPort串口通信时,这里采用“自发自收”(由于没有现成的单片机)。

           发现了一个问题,就是传输速度太慢,大概速度:1字节/4毫秒,但实际要求要达到:1字节/1毫秒。

           所以自己参照技术主管的封装类自己写了一个,旨在提高串口传输数据速度同时提高自己的编程能力。

           下面为该类的代码实现:

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

 class SerialPortHelper//当前类为串口的封装类
    {
        public SerialPort serialport = null;
        public bool isOpen = false;
        public delegate bool SerialPortDataReceived(byte[] zj);
        public event SerialPortDataReceived serialPortDataReceived = null;
        int maxinterval = 0;//定义一个接受字节的最大时间间隔
        public SerialPortHelper()
        {
            serialport = new SerialPort();//实例化串口对象
        }
        public SerialPortHelper(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits)
        {
            serialport = new SerialPort();//实例化并初始化串口对象
            serialport.PortName = portName;
            serialport.BaudRate = baudRate;
            serialport.DataBits = dataBits;
            serialport.Parity = parity;
            serialport.StopBits = stopBits;
            //创建委托 “SerialDataReceivedEventHandler”类型的对象,用该对象来持有符合其方法定义标准的指定方法
            //SerialDataReceivedEventHandler seriDataReceEvenHandler =AcceptData;

           //这里特别注意的是不能使用同一个委托对象,因为这样他会把当前接受到的数据和上次接受到的数据放到一块给我们一            //块返回并显示出来。
            //串口对象的数据接受事件属性为 “SerialDataReceivedEventHandler”类型,所以把持有数据接受方法的委托对象赋值给他。
            serialport.DataReceived +=new SerialDataReceivedEventHandler(AcceptData);
            //在打开串口前设置串口的常用参数
            serialport.ReceivedBytesThreshold = 1;
            serialport.ReadBufferSize = 526;
            serialport.WriteBufferSize = 526;
            serialport.WriteTimeout = 1000;
            serialport.ReadTimeout = 1000;
            if (baudRate<=19200)
            {
                maxinterval = 25;
            }
            else
            {
                maxinterval = 15;
            }
        }
        public bool openPort()
        {
            try
            {
                if (serialport.IsOpen == false)
                {
                    serialport.Open();
                    isOpen = true;
                    return isOpen;
                }
                
                isOpen = false;
                return isOpen;

            }
            catch(Exception ex)
            {
               MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
               isOpen = true;
               return isOpen;
            }
        }
        public bool closePort()
        {
            serialport.Close();
            isOpen = false;
            return isOpen;
        }
        public void SendData(byte[]  zj)
        {
            serialport.Write(zj,0,zj.Length);
        }
        public void AcceptData(object sender,SerialDataReceivedEventArgs e)
        {
            try
            {
                int count = 0;
                maxinterval = 15;
                System.Threading.Thread.Sleep(maxinterval);
                for (int t = 0; t < 20; t++)
                {
                    if (serialport.BytesToRead == count)
                    {
                        break;
                    }
                    else
                    {
                        count = serialport.BytesToRead;
                        System.Threading.Thread.Sleep(maxinterval);
                    }
                }
                count = serialport.BytesToRead;
                byte[] accepData = new byte[count];
                serialport.Read(accepData, 0, count);
                if (serialPortDataReceived != null && accepData.Length > 0)
                {
                    serialPortDataReceived(accepData);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值