• C# 小的知识点


    1、快速的从一个数组中找到最接近 Y 的那个值

    (比如说Y=3.5,数组validData中最接近Y的是3.6,则最后希望Y等于3.6)

    var result = (from x in validData select new { Key = x, Value = Math.Abs(x - Y) }).OrderBy(x => x.Value);
    Y = result.ToList()[0].Key;

    或许不是最简单的方法,希望大侠指正!

    2、上下位机通讯之数据格式-一种可行的方案

    上下位机都定义一种Descriptor的数据格式

    上位机端的继承关系(C#):

      Descriptor->List<BlockCollection

      BlockCollection->List<DescriptorBlock>

      DescriptorBlock->ArrayList

      StringBlock->DescriptorBlock(StringBlock 具有字符串处理的特殊方法,做特殊处理)

      DescriptorCollection 代表记录的条数,比如说Descriptor Channeltable,一台机一共有10个channel,那么就有10个DescriptorCollection。

      DescriptorBlock(StringBlock) 代表很多条数组记录,比如说。频率一条记录,子通道一条记录,功率一条记录,其他标志位一条记录。频率和子通道又可以分为发射和接收两个记录。所以有

      DescriptoBlockr[0][x] = R/T frequency,

      DescriptoBlockr[1][x] = R/T subChannel,

      DescriptorBlock[2][x] = 功率标志,

      DescriptorBlock[3][x] = 其他标志位。

    下位机 C语言端

      下位机具有类似的结构

      

    typedef struct
    {
        uint8_t flags;           
        uint8_t data_count;      
        char* data_type;         
        char* name;              
        char* description;       
        void* data;              
        void* callback_set;      
        void* callback_get;      
    }PC_PROTOCOL_DESCRIPTOR;

      {PC_PROTOCOL_FLAG_READ, 0, "1","2", "3", NULL1, NULL2, NULL3}

      PC_PROTOCOL_FLAG_READ  :权限标志位 flags.

      0               :记录个数位,想当与上面的10个channel记录 date_count.

      "1"               :数据类型 data_type.

      "2"               :名称  name.

      "3"               :描述  description.

      NULL1            :数据 data.

      NULL2            :上位机发出写命令执行的函数 callback_set.

      NULL3            :上位机发出读命令执行的函数 callback_get.

      数据类型用string类型来表示的特殊说明:

    因为在一个Descriptor中未必只有一种数据类型,写个枚举定义每个类型,将枚举值转换成字符串一起发送。上下位机约定相同的枚举类型,就能保证共同的数据类型。比如说:

    C#描述

            public enum DataTypes
            {
                UINT8 = (0x01),
                INT8 = (0x02),
                UINT16 = (0x03),
                INT16 = (0x04),
                UINT32 = (0x05),
                INT32 = (0x06),
                INT64 = (0x07),
                UINT64 = (0x08),
                BOOL = (0x10),
                FLOAT = (0x20),    
                DOUBLE = (0x21),
                STRING = (0x30),
                STRING_PTR = (0x31),
            };
    C语言描述:
    /* Descriptor data types */
    #define PC_PROTOCOL_TYPE_UINT8                   0x01
    #define PC_PROTOCOL_TYPE_UINT8_STR             "x01"
    #define PC_PROTOCOL_TYPE_INT8                   0x02
    #define PC_PROTOCOL_TYPE_INT8_STR              "x02"
    #define PC_PROTOCOL_TYPE_UINT16                   0x03
    #define PC_PROTOCOL_TYPE_UINT16_STR             "x03"
    #define PC_PROTOCOL_TYPE_INT16                   0x04
    #define PC_PROTOCOL_TYPE_INT16_STR             "x04"
    #define PC_PROTOCOL_TYPE_UINT32                   0x05
    #define PC_PROTOCOL_TYPE_UINT32_STR             "x05"
    #define PC_PROTOCOL_TYPE_INT32                   0x06
    #define PC_PROTOCOL_TYPE_INT32_STR             "x06"
    #define PC_PROTOCOL_TYPE_INT64                   0x07
    #define PC_PROTOCOL_TYPE_INT64_STR             "x07"
    #define PC_PROTOCOL_TYPE_UINT64                   0x08
    #define PC_PROTOCOL_TYPE_UINT64_STR             "x08"
    #define PC_PROTOCOL_TYPE_BOOL                   0x10
    #define PC_PROTOCOL_TYPE_BOOL_STR             "x10"
    #define PC_PROTOCOL_TYPE_FLOAT                   0x20
    #define PC_PROTOCOL_TYPE_FLOAT_STR             "x20"
    #define PC_PROTOCOL_TYPE_DOUBLE                   0x21
    #define PC_PROTOCOL_TYPE_DOUBLE_STR             "x21"
    #define PC_PROTOCOL_TYPE_STRING                   0x30
    #define PC_PROTOCOL_TYPE_STRING_STR             "x30"
    #define PC_PROTOCOL_TYPE_STRING_PTR            0x31
    #define PC_PROTOCOL_TYPE_STRING_PTR_STR      "x31"

    发送的时候 channel UINT16两个数据,UINT8两个数据,UINT16一个数据,string一个数据(7个字节)完整的描述为:
    {PC_PROTOCOL_FLAG_READ | PC_PROTOCOL_FLAG_WRITE | PC_PROTOCOL_FLAG_EXTRA_TIME,    CHANNEL_COUNT_PMR_446,     PC_PROTOCOL_TYPE_UINT16_STR "x02" PC_PROTOCOL_TYPE_UINT8_STR "x02" PC_PROTOCOL_TYPE_UINT16_STR  "x01" PC_PROTOCOL_TYPE_STRING_STR "x07"    , "ChannelTable",         "Channel table",     &reg32,    PC_WriteChannelDataTable,     PC_ReadChannelDataTable},
    
    
     
  • 相关阅读:
    ASP+Access UTF-8 网页乱码问题解决办法
    使用PowerDesigner生成Access数据库
    crontab详解
    Pending Statistics
    Recovery with Incremental Backups
    ASP的Global.asa使用说明
    cocos基础教程(5)数据结构介绍之cocos2d::Map<K,V>
    cocos基础教程(5)数据结构介绍之cocos2d::Vector
    cocos基础教程(4)基础概念介绍
    cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践
  • 原文地址:https://www.cnblogs.com/-liszt/p/3552693.html
Copyright © 2020-2023  润新知