zoukankan      html  css  js  c++  java
  • C# 封装串口通信

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO.Ports;
    
    namespace SerialPortControl
    {
        class SerialEventArgs
        {
            public SerialEventArgs()
            {
    
            }
    
            public string Code { get; internal set; }
        }
    
        class SerailPortDevice
        {
            enum SerialDataType
            {
                HEX,
                ASCII,
                UTF8,
                UNICODE,
            }
    
            private SerialPort m_serialPort = null;
            private int m_type = (int)SerialDataType.ASCII;
    
            public bool openSerialPort(string portName, int baudRate = 9600, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
            {
                try
                {
                    if (m_serialPort != null)
                    {
                        m_serialPort.Close();
                    }
                    m_serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
                    m_serialPort.Open();
                    m_serialPort.DataReceived += new SerialDataReceivedEventHandler(onReceiveSerailData);
                    return true;
                }
                catch(Exception e)
                {
                    Console.WriteLine("open error:", e);
                    return false;
                }
            }
    
            public void closeSerialPort()
            {
                if (isOpen)
                {
                    m_serialPort.Close();
                    m_serialPort = null;
                }
            }
    
            public bool isOpen
            {
                get
                {
                    return (m_serialPort != null && m_serialPort.IsOpen);
                }
            }
    
            public static string[] allSerialPort()
            {
                //foreach (string name in SerialPort.GetPortNames())
                //{
                //    Console.WriteLine(name);
                //}
                return SerialPort.GetPortNames();
            }
    
            public bool sendSerailData(string msg)
            {
                if (isOpen)
                {
                    try
                    {
                        m_serialPort.Write(msg);
                        return true;
                    }
                    catch(Exception err)
                    {
                        Console.WriteLine("send err:", err);
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
    
            public int setSerailType
            {
                get { return m_type; }
                set
                {
                    if (value > 3)
                    {
                        m_type = (int)SerialDataType.ASCII;
                    }
                    else
                    {
                        m_type = value;
                    }
                }
            }
    
            private void parseSerailData(byte[] data)
            {
                string strResult;
                // 数据转换
                if (m_type == (int)SerialDataType.HEX)
                {
                    StringBuilder strBuild = new StringBuilder();
                    for (int i = 0; i < data.Length; i++)
                    {
                        strBuild.AppendFormat("{0:x2}" + " ", data[i]);
                    }
                    strResult = strBuild.ToString().ToUpper();
                }
                else if (m_type == (int)SerialDataType.ASCII)
                {
                    strResult = new ASCIIEncoding().GetString(data);
                }
                else if (m_type == (int)SerialDataType.UTF8)
                {
                    strResult = new UTF8Encoding().GetString(data);
                }
                else
                {
                    strResult = new UnicodeEncoding().GetString(data);
                }
    
                if (this.sigDataReceived != null)
                {
                    sigDataReceived(this, new SerialEventArgs() { Code = strResult });
                }
            }
    
            private void onReceiveSerailData(object sender, SerialDataReceivedEventArgs e)
            {
                byte[] ReDatas = new byte[m_serialPort.BytesToRead];
                int result = m_serialPort.Read(ReDatas, 0, ReDatas.Length);
                if (result <= 0)
                {
                    return;
                }
                parseSerailData(ReDatas);
                m_serialPort.DiscardInBuffer();
            }
    
            public event EventHandler<SerialEventArgs> sigDataReceived;
        }
    }

    界面程序接收串口消息:

    m_serailPortDevice = new SerailPortDevice();
    m_serailPortDevice.sigDataReceived += onHandleSerialEvent;
    
    
    private void onHandleSerialEvent(object sender, SerialEventArgs e)
    {
        string code = e.Code;
        //程序出错,添加以下代码
        BeginInvoke(new MethodInvoker(delegate
        {
             this.richTextBox.AppendText(code);
        }));
    }
  • 相关阅读:
    Linux下hook指定库
    一行一行往上爬
    高可用数据同步方案-SqlServer迁移Mysql实战
    Hystrix核心基础
    Fastjson解析多级泛型的几种方式—使用class文件来解析多级泛型
    面试大全之JVM篇
    云原生下的CICD
    学习Raft算法的笔记
    Go语言下的线程模型
    分布式事务解决方案以及 .Net Core 下的实现(上)
  • 原文地址:https://www.cnblogs.com/caiyingyong/p/13268105.html
Copyright © 2011-2022 走看看