c# com

文章详细描述了一个名为SerialPortControl的C#类,用于控制串口通信,包括创建串口对象、设置参数、打开连接、发送数据(字符串和16进制)、读取数据以及关闭连接等操作。
摘要由CSDN通过智能技术生成

using System;

using System.Collections.Generic;

using System.IO.Ports;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Base

{

    public class SerialPortControl

    {      

        public bool Create(string portName, int baudRate, Parity parity, StopBits stopBit, int dataBit, Handshake handshake, int timeOut, ref SerialPort serialPort)

        {

            try

            {

                serialPort = new SerialPort();

                serialPort.PortName = portName;

                serialPort.BaudRate = baudRate;//波特率

                serialPort.Parity = parity;

                serialPort.StopBits = stopBit;//停止位

                serialPort.DataBits = dataBit;//数据位8

                serialPort.Handshake = handshake;//控制流

                serialPort.ReadTimeout = timeOut;

                serialPort.WriteTimeout = timeOut;

                return true;

            }

            catch (Exception e)

            {

                return false;

            }

        }

        public bool Open(ref SerialPort serialPort)

        {

            try

            {

                if (serialPort != null) serialPort.Open();

                return serialPort.IsOpen;

            }

            catch (Exception e)

            {

                return false;

            }

        }

        public bool Send(SerialPort serialPort, string sendMsg)

        {

            serialPort.Write(sendMsg);

            return true;

        }

        public bool Send(SerialPort serialPort, char[] sendMsg)

        {

            serialPort.Write(sendMsg, 0, sendMsg.Length);

            return true;

        }

        public string Read(SerialPort serialPort)

        {

            int len = serialPort.BytesToRead;

            Byte[] readBuffer = new Byte[len];

            serialPort.Read(readBuffer, 0, len); //将数据读入缓存

           

            //len = serialPort.ReadChar();

            //char[] data = new Char[serialPort.ReadChar()];

            //serialPort.Read(data, 0, len);

            return Encoding.Default.GetString(readBuffer);

            //char[] data = new Char[serialPort.ReadChar()];

            //serialPort.Read(data, 0, serialPort.ReadChar());

            //string str = "";

            //for (int i = 0; i < data.Length; i++)

            //{

            //    str += Convert.ToInt32(data, 16);

            //}

            //return Encoding.Default.GetString(data);

        }

        public void Close(SerialPort serialPort)

        {

            if(serialPort != null) serialPort.Close();

        }

        /// <summary>

        /// 发送字符串

        /// </summary>

        /// <param name="serialPort"></param>

        /// <param name="sendStr"></param>

        /// <param name="recStr"></param>

        /// <returns></returns>

        public bool SendAndReadString(SerialPort serialPort, string sendStr,  ref string recStr)

        {

            try

            {

                serialPort.DiscardInBuffer();

                serialPort.DiscardOutBuffer();

                serialPort.Write(sendStr);

                long startTime = DateTime.Now.Ticks / 10000;

                long endTime = 0;

                while (endTime - startTime <= serialPort.ReadTimeout)

                {

                    int len = serialPort.BytesToRead;

                    byte[] readBuffer = new byte[len];

                    serialPort.Read(readBuffer, 0, len); //将数据读入缓存

                    recStr = Encoding.Default.GetString(readBuffer);

                    if (recStr.Length > 0) return true;

                    if (serialPort.ReadTimeout > 0) endTime = DateTime.Now.Ticks / 10000;

                }

                return false;

            }

            catch (Exception ex) { MyLog.saveException("SerialPortTool操作类Read异常" + "," + ex.Message + ":" + ex.ToString()); return false; }

        }

        /// <summary>

        /// 16进制发送

        /// </summary>

        /// <param name="serialPort"></param>

        /// <param name="sendStr"></param>

        /// <param name="recStr"></param>

        /// <param name="isRecSorce"></param>

        /// <returns></returns>

        public bool SendAndReadHexString(SerialPort serialPort, string sendStr, ref string recStr, bool isRecSorce)

        {

            try

            {

                if (!serialPort.IsOpen) return false;

                byte[] sendByte = HexStringToByteArray(sendStr);

                serialPort.DiscardInBuffer();

                serialPort.DiscardOutBuffer();

                serialPort.Write(sendByte, 0, sendByte.Length);

                long startTime = DateTime.Now.Ticks / 10000;

                long endTime = 0;

                while (endTime - startTime <= serialPort.ReadTimeout)

                {

                    int len = serialPort.BytesToRead;

                    byte[] readBuffer = new byte[len];

                    serialPort.Read(readBuffer, 0, len); //将数据读入缓存

                    if (!isRecSorce) recStr = Encoding.Default.GetString(readBuffer);

                    if (isRecSorce)

                    {

                        byte[] vs = new byte[] { readBuffer[3], readBuffer[4], readBuffer[5], readBuffer[6] };

                        recStr = ByteArrayToHexString(vs);//0103040000006BBBDC

                        int a = Convert.ToInt32(recStr, 16);

                        recStr = a.ToString();

                    };

                    if (recStr.Length > 0) return true;

                    if (serialPort.ReadTimeout > 0) endTime = DateTime.Now.Ticks / 10000;

                }

                return false;

            }

            catch (IndexOutOfRangeException) { return false; }

            catch (ArgumentOutOfRangeException) { return false; }

            catch (Exception ex) { MyLog.saveException("SerialPortTool操作类SendAndRead异常" + "," + ex.Message + ":" + ex.ToString()); return false; }

        }

        //16进制字符串转化为字节数组

        private byte[] HexStringToByteArray(string s)

        {

            s = s.Replace(" ", "");

            byte[] buffer = new byte[s.Length / 2];

            for (int i = 0; i < s.Length; i += 2)

                buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);

            return buffer;

        }

        //字节数组转化为16进制字符串

        private string ByteArrayToHexString(byte[] data)

        {

            StringBuilder sb = new StringBuilder(data.Length * 3);

            foreach (byte b in data)

                sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));

            return sb.ToString().ToUpper();

        }

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值