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},

 
原文地址:https://www.cnblogs.com/-liszt/p/3552693.html