开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 29046|回复: 5
收起左侧

[C#源码] 2016年写的串口类,怎么感觉当年的水平比现在还高了?

[复制链接]
发表于 2018-8-3 08:23:37 | 显示全部楼层 |阅读模式   广东省东莞市

上代码:

当年的代码居然还用了设计模式。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO.Ports;
  6. using System.Diagnostics;
  7. using System.Threading;
  8. using System.IO;

  9. namespace PlcCommunication
  10. {
  11.     /*********************************************************************
  12.     *文件说明: 串口读写模块
  13.     *作者:     很想停止
  14.     *日期:     2016/03/10
  15.     *环境:     NET Framework 4或更高
  16.     *
  17.     *修改日志:
  18.     *
  19.     *
  20.     ***********************************************************************/

  21.     public class ReceivedDataEventArgs : EventArgs, IFormattable
  22.     {
  23.         public IList<byte> RecData { get; private set; }
  24.         public ReceivedDataEventArgs(IList<byte> data)
  25.         {
  26.             this.RecData = data;
  27.         }

  28.         public enum IFormattableType
  29.         {
  30.             hex, str, dec
  31.         }

  32.         public string ToString(string format, IFormatProvider provider)
  33.         {
  34.             StringBuilder sb1 = new StringBuilder();
  35.             
  36.             if(format.Equals(IFormattableType.hex.ToString()))
  37.             {
  38.                 (from r in RecData.ToArray<byte>()
  39.                     select new
  40.                     {
  41.                         hexStr = Convert.ToString(r, 16)
  42.                     }).ToList().ForEach(s => sb1.Append(s.hexStr + " "));
  43.                 return sb1.ToString();
  44.             }
  45.             else if(format.Equals(IFormattableType.str.ToString()))
  46.             {
  47.                 (from r in RecData.ToArray<byte>()
  48.                     select new
  49.                     {
  50.                         Str = (char)r
  51.                     }).ToList().ForEach(s => sb1.Append(s.Str));
  52.                 return sb1.ToString();
  53.             }
  54.             else if(format.Equals(IFormattableType.dec.ToString()))
  55.             {
  56.                 (from r in RecData.ToArray<byte>()
  57.                     select new
  58.                     {
  59.                         Str = Convert.ToString(r, 10)
  60.                     }).ToList().ForEach(s => sb1.Append(s.Str + " "));
  61.                 return sb1.ToString();
  62.             }
  63.             else
  64.                 throw new ArgumentException("ToString");

  65.             
  66.         }
  67.     }

  68.     public class SerialResult
  69.     {
  70.         public bool isRead { get; internal set; }
  71.         public bool isWrite { get; internal set; }
  72.         public IList<byte> WriteValue { get; internal set; }
  73.         public int ReadSum { get; internal set; }
  74.         public IList<byte> ReceivedData { get; internal set; }
  75.         public bool isReceived { get; internal set; }

  76.         public SerialResult()
  77.         {
  78.             this.isRead = false;
  79.             this.isWrite = false;
  80.             this.WriteValue = new byte[] { };
  81.             this.ReadSum=0;
  82.             this.isReceived = false;
  83.             this.ReceivedData = new byte[] { };
  84.         }

  85.     }


  86.     public class SerialFun : SerialResult
  87.     {
  88.         public event EventHandler<ReceivedDataEventArgs> RecDataInfo;
  89.       

  90.         private struct PortWriteHistory
  91.         {
  92.             public byte[] writeBytes;
  93.             public DateTime writeDate;
  94.         }

  95.         private struct PortRecHistory
  96.         {
  97.             public IList<byte> recBytes;
  98.             public DateTime recTime;
  99.         }


  100.         #region Protery
  101.         protected SerialPort serialPort = new SerialPort();
  102.         public string PortExpainString { get; private set; }
  103.         public int PortNo { get; private set; }
  104.         public string PortName { get; private set; }
  105.         public int PortBaudRate { get; private set; }
  106.         public int PortDataBits { get; private set; }
  107.         public Parity PortParity { get; private set; }
  108.         public StopBits PortStopBits { get; private set; }
  109.         public byte[] EndByte { get; set; }
  110.         #endregion

  111.         private const int historySum=5;
  112.         private Queue<PortWriteHistory> writeHistory = new Queue<PortWriteHistory>(historySum);
  113.         private Queue<PortRecHistory> recHistory = new Queue<PortRecHistory>(historySum);
  114.         private IList<byte> alreadyReadbytes;
  115.         private static Object objectWrite = false;
  116.         


  117.         public struct SerialParamType
  118.         {
  119.             public string PortName;
  120.             public int PortBaudRate;
  121.             public int PortDataBits;
  122.             public Parity PortParity;
  123.             public StopBits PortStopBits;
  124.         }

  125.         public SerialFun()
  126.             : base()
  127.         {
  128.         }

  129.         public SerialFun(int portNo, string portExpaintStr, SerialParamType param)
  130.         {
  131.             if (portNo < 1 || portExpaintStr.Length < 1 || param.PortName == null)
  132.                 throw new ArgumentException("SerialFun");

  133.             try
  134.             {
  135.                 SerialPortsInit(param);
  136.             }
  137.             catch (System.IO.IOException ex)
  138.             {
  139.                 throw ex;
  140.             }
  141.             
  142.             this.PortExpainString = portExpaintStr;
  143.             this.PortNo = portNo;
  144.             alreadyReadbytes = new List<byte>();
  145.             RecDataInfo += recDataOperation;
  146.         }

  147.         public string GetHistory(PlcCommunication.ReceivedDataEventArgs.IFormattableType type)
  148.         {
  149.             StringBuilder sb1=new StringBuilder();
  150.             sb1.Append("Write History:\n");
  151.             (from r in writeHistory
  152.              select new
  153.              {
  154.                  writeStr = string.Format("[{0:" + type.ToString() + "}],{1}",
  155.                  new ReceivedDataEventArgs(r.writeBytes.ToList()) , r.writeDate.ToString())
  156.              }).ToList().ForEach(s => sb1.Append(s + "\n"));
  157.            sb1.Append("\nRecevide History:\n");

  158.            StringBuilder sb2 = new StringBuilder();
  159.            (from r in recHistory
  160.             select new
  161.             {
  162.                 recStr1 = string.Format("[{0:" + type.ToString() + "}],{1}",
  163.                 new ReceivedDataEventArgs(r.recBytes), r.recTime.ToString())
  164.             }).ToList().ForEach(s => sb2.Append(s + "\n"));
  165.            return sb1.ToString() + sb2.ToString();
  166.         }

  167.         private void SerialPortsInit(SerialParamType Portparameter)
  168.         {
  169.             Debug.Assert(serialPort != null);
  170.             try
  171.             {
  172.                 serialPort.PortName = Portparameter.PortName;
  173.                 serialPort.BaudRate = Portparameter.PortBaudRate;
  174.                 serialPort.DataBits = Portparameter.PortDataBits;
  175.                 serialPort.Parity = Portparameter.PortParity;
  176.                 serialPort.PortName = Portparameter.PortName;
  177.                 serialPort.StopBits = Portparameter.PortStopBits;
  178.                 serialPort.ReceivedBytesThreshold = 1;
  179.                 serialPort.Open();
  180.                 serialPort.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
  181.             }
  182.             catch(System.IO.IOException ex)
  183.             {
  184.                 throw ex;
  185.             }
  186.         }

  187.         public void Close()
  188.         {
  189.             if (serialPort != null && serialPort.IsOpen)
  190.                 serialPort.Close();
  191.         }


  192.         public void Write(string content)
  193.         {
  194.             try
  195.             {
  196.                 lock (objectWrite)
  197.                 {
  198.                     alreadyReadbytes.Clear();
  199.                     writeHistory.Enqueue(new PortWriteHistory
  200.                     {
  201.                         writeBytes = System.Text.Encoding.Default.GetBytes(content)
  202.                         ,
  203.                         writeDate = DateTime.Now
  204.                     });

  205.                     base.isWrite = true;
  206.                     base.isReceived = false;
  207.                     serialPort.Write(content);
  208.                 }
  209.             }
  210.             catch (TimeoutException ex)
  211.             {
  212.                 throw ex;
  213.             }
  214.             catch (InvalidOperationException ex)
  215.             {
  216.                 throw ex;
  217.             }
  218.         }

  219.         public void Write(byte[] content,int offset=0,int count=0)
  220.         {
  221.             try
  222.             {
  223.                 lock (objectWrite)
  224.                 {
  225.                     alreadyReadbytes.Clear();
  226.                     writeHistory.Enqueue(new PortWriteHistory {  writeBytes = content, writeDate = DateTime.Now });
  227.                     count = count == 0 ? content.Length - 1 : count;
  228.                     serialPort.Write(content,offset,count);
  229.                 }
  230.             }
  231.             catch (TimeoutException ex)
  232.             {
  233.                 throw ex;
  234.             }
  235.             catch (InvalidOperationException ex)
  236.             {
  237.                 throw ex;
  238.             }
  239.         }

  240.         public byte[] Read(int nCount)
  241.         {
  242.             byte[] buf=new byte[nCount];
  243.             try
  244.             {
  245.                 serialPort.Read(buf, 0, nCount);
  246.             }
  247.             catch (ArgumentOutOfRangeException ex)
  248.             {
  249.                 throw ex;
  250.             }
  251.             catch (TimeoutException ex)
  252.             {
  253.                 throw ex;
  254.             }
  255.             catch (InvalidOperationException ex)
  256.             {
  257.                 throw ex;
  258.             }
  259.             
  260.             return buf;
  261.         }

  262.         public IList<string> GetMacPortList()
  263.         {
  264.             Debug.Assert(serialPort != null);

  265.             IList<string> PortList = new List<string>();
  266.             foreach (var m in SerialPort.GetPortNames())
  267.             {
  268.                 PortList.Add(m);
  269.             }
  270.             return PortList;
  271.         }

  272.         private static string RepeatStr(string repeatStr, int count)
  273.         {
  274.             StringBuilder sb = new StringBuilder();
  275.             Enumerable.Repeat(repeatStr, count).ToList().ForEach(s => sb.Append(s));
  276.             return sb.ToString();
  277.         }

  278.         private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
  279.         {
  280.             var sport = (sender as SerialPort);
  281.             int nRead = sport.BytesToRead;
  282.             Read(nRead).ToList().ForEach(s => alreadyReadbytes.Add(s));

  283.             var query = (from r in alreadyReadbytes
  284.                             from y in EndByte
  285.                             select new
  286.                             {
  287.                                 IsEndSymbol = y == r
  288.                             }).ToList().Count(s => s.IsEndSymbol == true);
  289.             if (query == EndByte.Length)
  290.             {
  291.                 base.isReceived = !base.isReceived;
  292.                 base.ReceivedData = alreadyReadbytes.ToArray();
  293.               
  294.                 recHistory.Enqueue(new PortRecHistory { recBytes = alreadyReadbytes, recTime = DateTime.Now });
  295.                 RecDataInfo(this, new ReceivedDataEventArgs(alreadyReadbytes));
  296.                 alreadyReadbytes.Clear();
  297.             }
  298.         }


  299.         public void GetASCIItable()
  300.         {
  301.             string msg =
  302.             @"

  303.             二进制        十进制        十六进制        缩写        可以显示的表示法        名称/意义
  304.             0000 0000        0        00        NUL                空字符(Null)
  305.             0000 0001        1        01        SOH                标题开始
  306.             0000 0010        2        02        STX                本文开始
  307.             0000 0011        3        03        ETX                本文结束
  308.             0000 0100        4        04        EOT                传输结束
  309.             0000 0101        5        05        ENQ                请求
  310.             0000 0110        6        06        ACK                确认回应
  311.             0000 0111        7        07        BEL                响铃
  312.             0000 1000        8        08        BS                退格
  313.             0000 1001        9        09        HT                水平定位符号
  314.             0000 1010        10        0A        LF                换行键
  315.             0000 1011        11        0B        VT                垂直定位符号
  316.             0000 1100        12        0C        FF                换页键
  317.             0000 1101        13        0D        CR                归位键
  318.             0000 1110        14        0E        SO                取消变换(Shift out)
  319.             0000 1111        15        0F        SI          启用变换(Shift in)
  320.             0001 0000        16        10        DLE                跳出数据通讯
  321.             0001 0001        17        11        DC1                设备控制一(XON 启用软件速度控制)
  322.             0001 0010        18        12        DC2                设备控制二
  323.             0001 0011        19        13        DC3                设备控制三(XOFF 停用软件速度控制)
  324.             0001 0100        20        14        DC4                设备控制四
  325.             0001 0101        21        15        NAK                确认失败回应
  326.             0001 0110        22        16        SYN                同步用暂停
  327.             0001 0111        23        17        ETB                区块传输结束
  328.             0001 1000        24        18        CAN                取消
  329.             0001 1001        25        19        EM            连接介质中断
  330.             0001 1010        26        1A        SUB                替换
  331.             0001 1011        27        1B        ESC                跳出
  332.             0001 1100        28        1C        FS                文件分割符
  333.             0001 1101        29        1D        GS                组群分隔符
  334.             0001 1110        30        1E        RS                记录分隔符
  335.             0001 1111        31        1F        US                单元分隔符
  336.             0111 1111        127        7F        DEL                删除

  337.             ASCII可显示字符

  338.             二进制            十进制        十六进制        图形
  339.             0010 0000            32        20        (空格)
  340.             0010 0001            33        21        !
  341.             0010 0010            34        22        引号
  342.             0010 0011            35        23        #
  343.             0010 0100            36        24        $
  344.             0010 0101            37        25        %
  345.             0010 0110            38        26        &
  346.             0010 0111            39        27        '
  347.             0010 1000            40        28        (
  348.             0010 1001            41        29        )
  349.             0010 1010            42        2A        *
  350.             0010 1011            43        2B        +
  351.             0010 1100            44        2C        ,
  352.             0010 1101            45        2D        -
  353.             0010 1110            46        2E        .
  354.             0010 1111            47        2F        /
  355.             0011 0000            48        30        0
  356.             0011 0001            49        31        1
  357.             0011 0010            50        32        2
  358.             0011 0011            51        33        3
  359.             0011 0100            52        34        4
  360.             0011 0101            53        35        5
  361.             0011 0110            54        36        6
  362.             0011 0111            55        37        7
  363.             0011 1000            56        38        8
  364.             0011 1001            57        39        9
  365.             0011 1010            58        3A        :
  366.             0011 1011            59        3B        ;
  367.             0011 1100            60        3C        <
  368.             0011 1101            61        3D        =
  369.             0011 1110            62        3E        >
  370.             0011 1111            63        3F        ?
  371.             0100 0000            64        40        @
  372.             0100 0001            65        41        A
  373.             0100 0010            66        42        B
  374.             0100 0011            67        43        C
  375.             0100 0100            68        44        D
  376.             0100 0101            69        45        E
  377.             0100 0110            70        46        F
  378.             0100 0111            71        47        G
  379.             0100 1000            72        48        H
  380.             0100 1001            73        49        I
  381.             0100 1010            74        4A        J
  382.             0100 1011            75        4B        K
  383.             0100 1100            76        4C        L
  384.             0100 1101            77        4D        M
  385.             0100 1110            78        4E        N
  386.             0100 1111            79        4F        O
  387.             0101 0000            80        50        P
  388.             0101 0001            81        51        Q
  389.             0101 0010            82        52        R
  390.             0101 0011            83        53        S
  391.             0101 0100            84        54        T
  392.             0101 0101            85        55        U
  393.             0101 0110            86        56        V
  394.             0101 0111            87        57        W
  395.             0101 1000            88        58        X
  396.             0101 1001            89        59        Y
  397.             0101 1010            90        5A        Z
  398.             0101 1011            91        5B        [
  399.             0101 1100            92        5C        \
  400.             0101 1101            93        5D        ]
  401.             0101 1110            94        5E        ^
  402.             0101 1111            95        5F        _                
  403.             0110 0000            96        60        `
  404.             0110 0001            97        61        a
  405.             0110 0010            98        62        b
  406.             0110 0011            99        63        c
  407.             0110 0100            100        64        d
  408.             0110 0101            101        65        e
  409.             0110 0110            102        66        f
  410.             0110 0111            103        67        g
  411.             0110 1000            104        68        h
  412.             0110 1001            105        69        i
  413.             0110 1010            106        6A        j
  414.             0110 1011            107        6B        k
  415.             0110 1100            108        6C        l
  416.             0110 1101            109        6D        m
  417.             0110 1110            110        6E        n
  418.             0110 1111            111        6F        o
  419.             0111 0000            112        70        p
  420.             0111 0001            113        71        q
  421.             0111 0010            114        72        r
  422.             0111 0011           115        73        s
  423.             0111 0100            116        74        t
  424.             0111 0101            117        75        u
  425.             0111 0110            118        76        v
  426.             0111 0111            119        77        w
  427.             0111 1000            120        78        x
  428.             0111 1001            121        79        y
  429.             0111 1010            122        7A        z
  430.             0111 1011            123        7B        {
  431.             0111 1100            124        7C        |
  432.             0111 1101            125        7D        }
  433.             0111 1110            126        7E        ~
  434.             ";
  435.             try
  436.             {
  437.                 string path = Environment.CurrentDirectory + "\\ascii.tmp";
  438.                 File.WriteAllText(path, msg, Encoding.UTF8);
  439.                 Process.Start("notepad.exe", path);
  440.             }
  441.             catch (Exception ex)
  442.             {
  443.                 throw ex;
  444.             }
  445.         }


  446.         private void recDataOperation(Object sender, ReceivedDataEventArgs e)
  447.         {
  448.             
  449.         }

  450.         public byte[] WaitReceivedData()
  451.         {
  452.             while (true)
  453.             {
  454.                 if (base.isReceived)
  455.                 {
  456.                     return base.ReceivedData.ToArray<byte>();
  457.                 }
  458.                 Thread.Sleep(20);
  459.             }
  460.         }
  461.    

  462.     }

  463.     public class SerialFunException : ApplicationException
  464.     {
  465.         public SerialFunException(string message)
  466.             : base(message)
  467.         {

  468.         }

  469.         public SerialFunException(string message, Exception innerException)
  470.             : base(message, innerException)
  471.         {
  472.         }

  473.     }

  474.     public class SerialFunPortOpenFail : SerialFunException
  475.     {
  476.         public SerialFunPortOpenFail(string message)
  477.             : base(message)
  478.         {
  479.         }

  480.         public SerialFunPortOpenFail(string message, Exception innerExcepton)
  481.             : base(message, innerExcepton)
  482.         {
  483.         }

  484.         private void appendParam()
  485.         {
  486.             this.Data["ErrorDate"] = DateTime.Now;
  487.             this.Source = "SerialFun类";
  488.             this.Data.Add("Excepton", "这个异常表示,端口打开失败!");
  489.         }
  490.     }


  491. }
复制代码


有用的着的朋友拿去吧。

结帖率:67% (2/3)

签到天数: 13 天

发表于 2023-11-27 13:16:19 | 显示全部楼层   广东省深圳市
学习了,收下了
回复 支持 反对

使用道具 举报

结帖率:57% (8/14)
发表于 2021-9-4 18:25:42 | 显示全部楼层   广东省深圳市
学习了,收下了
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2020-2-26 09:34:10 | 显示全部楼层   广东省广州市
看不懂。。。
回复 支持 反对

使用道具 举报

结帖率:80% (8/10)

签到天数: 1 天

发表于 2019-1-22 16:45:32 | 显示全部楼层   河北省石家庄市
冲个vip,一年2000次下载机会随便下,还可以上传下载的资源挣积分
回复 支持 反对

使用道具 举报

结帖率:50% (12/24)

签到天数: 3 天

发表于 2018-8-26 14:28:10 | 显示全部楼层   山东省聊城市

冲个vip,一年2000次下载机会随便下,还可以上传下载的资源挣积分
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表