首页 > 编程语言 >SerialPort串口操作类C#实现

SerialPort串口操作类C#实现

时间:2023-08-03 09:03:25浏览次数:31  
标签:string C# SerialPort int serialPort1 串口 new byte

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace communicationComm
{
    /********************************************************************************
     //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)
     *********************************************************************************/
    public class ToCom
    {

        private System.IO.Ports.SerialPort serialPort1 = new SerialPort();
        public delegate byte[] getDate(byte[] bts);
        private getDate mygetDate;
        private string com;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="com"></param>
        public ToCom(string com)
        {
            //初始化通讯所用参数
            this.com = com;
            serialPort1.PortName = com;  //端口号//com1 com2 com3 .... comN
            serialPort1.BaudRate = 9600;   //比特率
            serialPort1.Parity = Parity.None;//奇偶校验
            serialPort1.StopBits = StopBits.One;//停止位
            serialPort1.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常
        }

        #region 发送接收数据  public void SendMsg(string senStr)
        /// <summary>
        /// 发送接收数据
        /// </summary>
        /// <param name="senStr">发送数据的内容</param>
        public void SendMsg(string senStr)
        {
            //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)
            serialPort1.Open();

            byte[] myByte = StringToByte_2(senStr);
            //发送数据
            serialPort1.Write(myByte, 0, myByte.Length);
            //关闭串口
            serialPort1.Close();
        }

        /// <summary>
        /// 数据读取
        /// </summary>
        /// <returns></returns>
        public string ReadMsg()
        {
            //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)
            serialPort1.Open();
            string rd = "null ";
            #region 读数据老方法
            ////------------mothed1----
            //int i = serialPort1.ReadBufferSize;
            // byte[] data = Convert.FromBase64String(serialPort1.ReadLine());


            // rd = Encoding.Unicode.GetString(data);
            // //  mothed2
            //int DataLength = serialPort1.BytesToRead;

            //int i = 0;

            //StringBuilder sb = new StringBuilder();

            //while (i  < DataLength)
            //{

            //    byte[] ds = new byte[1024];

            //    int len = serialPort1.Read(ds, 0, 1024);

            // //   sb.Append(Encoding.ASCII.GetString(ds, 0, len));
            //    sb.Append(ByteToString(ds));

            //    i += len;

            //}
            // //  mothed2
            //byte[] data= new byte[serialPort1.BytesToRead];
            //int i = serialPort1.Read(data, 0, serialPort1.BytesToRead);

            //rd = ByteToString(data);

            #endregion

            //  mothed3  返回所有数据长度数组定义
            byte[] data = new byte[serialPort1.BytesToRead];
            //数据读取
            int i = serialPort1.Read(data, 0, serialPort1.BytesToRead);
            //接收后数据转化
            rd = ByteToString(data);
            //取得数据返回
            return rd;

        }
        // string getdate(byte[])

        public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] readBuffer = new byte[serialPort1.ReadBufferSize];
            serialPort1.Read(readBuffer, 0, readBuffer.Length);
            //this.Invoke(interfaceUpdataHandle, new string[] { Encoding.UTF8.GetString(readBuffer) });

            // this.Invoke(interfaceUpdataHandle, new string[] { ToCom.ByteToString(readBuffer) });
            string s = ToCom.ByteToString(readBuffer);

        }
        #endregion

        #region public int ReadComm(out Byte[] readBuf, int bufRoom, int HowTime, int ByteTime) 串口读(非阻塞方式读串口,直到串口缓冲区中没有数据
        ///  <summary>
        /// 串口读(非阻塞方式读串口,直到串口缓冲区中没有数据
        ///  </summary>
        ///  <param name="readBuf">串口数据缓冲 </param>
        ///  <param name="bufRoom">串口数据缓冲空间大小 </param>
        ///  <param name="HowTime">设置串口读放弃时间 </param>
        ///  <param name="ByteTime">字节间隔最大时间 </param>
        ///  <returns>串口实际读入数据个数 </returns>
        public int ReadComm(out Byte[] readBuf, int bufRoom, int HowTime, int ByteTime)
        {
            //throw new System.NotImplementedException();
            readBuf = new Byte[64];
            Array.Clear(readBuf, 0, readBuf.Length);

            int nReadLen, nBytelen;
            if (serialPort1.IsOpen == false)
                return -1;
            nBytelen = 0;
            serialPort1.ReadTimeout = HowTime;


            try
            {
                readBuf[nBytelen] = (byte)serialPort1.ReadByte();
                byte[] bTmp = new byte[1023];
                Array.Clear(bTmp, 0, bTmp.Length);

                nReadLen = ReadBlock(out bTmp, bufRoom - 1, ByteTime);

                if (nReadLen > 0)
                {
                    Array.Copy(bTmp, 0, readBuf, 1, nReadLen);
                    nBytelen = 1 + nReadLen;

                }

                else if (nReadLen == 0)
                    nBytelen = 1;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);

            }

            return nBytelen;
        }
        #endregion

        #region public int ReadBlock(out byte[] ReadBuf, int ReadRoom, int ByteTime) 串口同步读(阻塞方式读串口,直到串口缓冲区中没有数据,靠字符间间隔超时确定没有数据)
        ///  <summary>
        /// 串口同步读(阻塞方式读串口,直到串口缓冲区中没有数据,靠字符间间隔超时确定没有数据)
        ///  </summary>
        ///  <param name="ReadBuf">串口数据缓冲 </param>
        ///  <param name="ReadRoom">串口数据缓冲空间大小 </param>
        ///  <param name="ByteTime">字节间隔最大时间 </param>
        ///  <returns>从串口实际读入的字节个数 </returns>
        public int ReadBlock(out byte[] ReadBuf, int ReadRoom, int ByteTime)
        {
            //throw new System.NotImplementedException();
            ReadBuf = new byte[1024];
            Array.Clear(ReadBuf, 0, ReadBuf.Length);

            sbyte nBytelen;
            //long nByteRead;

            if (serialPort1.IsOpen == false)
                return 0;
            nBytelen = 0;
            serialPort1.ReadTimeout = ByteTime;

            while (nBytelen < (ReadRoom - 1))
            {
                try
                {
                    ReadBuf[nBytelen] = (byte)serialPort1.ReadByte();
                    nBytelen++; // add one
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                    break;
                }
            }
            ReadBuf[nBytelen] = 0x00;
            return nBytelen;

        }
        #endregion

        #region  public static string ByteToString(byte[] InBytes) 字符数组转字符串16进制
        ///  <summary>
        /// 字符数组转字符串16进制
        ///  </summary>
        ///  <param name="InBytes"> 二进制字节 </param>
        ///  <returns>类似"01 02 0F" </returns>
        public static string ByteToString(byte[] InBytes)
        {
            string StringOut = "";
            foreach (byte InByte in InBytes)
            {
                StringOut = StringOut + String.Format("{0:X2}", InByte) + " ";
            }

            return StringOut.Trim();
        }
        #endregion

        #region public static byte[] StringToByte(string InString) strhex 转字节数组
        ///  <summary>
        /// strhex 转字节数组
        ///  </summary>
        ///  <param name="InString">类似"01 02 0F" 用空格分开的  </param>
        ///  <returns> </returns>
        public static byte[] StringToByte(string InString)
        {
            string[] ByteStrings;
            ByteStrings = InString.Split(" ".ToCharArray());
            byte[] ByteOut;
            ByteOut = new byte[ByteStrings.Length];
            for (int i = 0; i <= ByteStrings.Length - 1; i++)
            {
                ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
            }
            return ByteOut;
        }
        #endregion

        #region ublic static byte[] StringToByte_2(string InString)  strhex 转字节数组
        ///  <summary>
        /// strhex 转字节数组
        ///  </summary>
        ///  <param name="InString">类似"01 02 0F" 中间无空格 </param>
        ///  <returns> </returns>
        public static byte[] StringToByte_2(string InString)
        {
            byte[] ByteOut;
            InString = InString.Replace(" ", "");
            try
            {
                string[] ByteStrings = new string[InString.Length / 2];
                int j = 0;
                for (int i = 0; i < ByteStrings.Length; i++)
                {

                    ByteStrings[i] = InString.Substring(j, 2);
                    j += 2;
                }

                ByteOut = new byte[ByteStrings.Length];
                for (int i = 0; i <= ByteStrings.Length - 1; i++)
                {
                    ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
                }
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }

            return ByteOut;
        }
        #endregion

        #region  public static string Str_To_0X(string InString)  字符串 转16进制字符串
        ///  <summary>
        /// 字符串 转16进制字符串
        ///  </summary>
        ///  <param name="InString">unico </param>
        ///  <returns>类似“01 0f” </returns>
        public static string Str_To_0X(string InString)
        {
            return ByteToString(UnicodeEncoding.Default.GetBytes(InString));
        }
        #endregion
    }

}

 

标签:string,C#,SerialPort,int,serialPort1,串口,new,byte
From: https://www.cnblogs.com/bluestorm/p/17602317.html

相关文章

  • Canvas好难,如何让研发低成本实现Web端流程图设计功能
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言相信大家在职场中经常会用到流程图,在互联网行业,绘制流程图不论在产品的设计阶段,还是后期优化业务流程的阶段,都有着巨大的价值。事实上,......
  • 《摄像头篇》c#使用Aforge调用摄像头拍照
    使用Aforge调用摄像头拍照参考链接:https://www.jb51.net/article/148364.htm这篇文章主要为大家详细介绍了C#使用Aforge调用摄像头拍照的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下本文实例为大家分享了C#使用Aforge调用摄像头拍照的具体......
  • rock5b 尝试一次裸板程序
    在linux虚拟机里安装arm64交叉编译环境aptinstallgccmakebinutilsgcc-aarch64-linux-gnu binutils-aarch64-linux-gnuflexbison写一个helloworld.caarch64-linux-gnu-gcc-ohelloworldhelloworld.cfilehelloworld cpto/tftpanddownloadtoubootsetenvser......
  • ArcGIS Pro计算字段将中文转换为拼音首字母大写
    将中文转换为拼音首字母,效果: 需要用到计算字段(GP或python都可以)计算字段GP: 1#转换汉字的代码块2deftransChinese(inputfield):3frompypinyinimportlazy_pinyin4foriininputfield:5namea=inputfield6cn_namelist=l......
  • 在使用pxcook的时候对于文字这方面的设置,一定要既有字号也有行高,这样pxcook的识别出的
    问题最终效果效果对应代码/*右侧课程表区域*/.banner.wrapper.schedule{width:218px;height:305px;margin-top:60px;border-radius:10px;background-color:#209dd5;}.banner.wrapper.schedule.schedule_title{padding:18px......
  • .NET Core WebAPI中使用Swagger(完整教程)
    一、Swagger简介1.1-什么是Swagger?Swagger是一个规范且完整的框架,用于生成、描述、调试和可视化Restfull风格的Web服务。Swagger的目标是对RestAPI定义一个标准且和语言无关的接口,可以让人和计算机拥有无需访问源码、文档或网络流量监控就可以发现和连接服务的能力。当通过S......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......
  • 运维——centos7安装Docker详细步骤(无坑版教程)
    转自:https://cloud.tencent.com/developer/article/1701451一、安装前必读在安装Docker之前,先说一下配置,我这里是Centos7Linux内核:官方建议3.10以上,3.8以上貌似也可。注意:本文的命令使用的是root用户登录执行,不是root的话所有命令前面要加sudo1.查看当前的内核版本......
  • 使用echarts画流程图
    场景流程图中涉及到弯曲的箭头,使用普通的css是画不出来的,至少我是没想到办法。效果图代码option={xAxis:{show:false,type:'value'},yAxis:{show:false,type:'value'},tooltip:{formatter:'{b}'},series:[{......
  • ImportResource导入Spring的xml配置文件
    @ImportResource注解主要用于导入Spring的xml配置文件注册的Bean。该注解只能使用配置类注解(@Configuration)或者组件注解(@Component)中使用,否则无效。  ......