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", ®32, PC_WriteChannelDataTable, PC_ReadChannelDataTable},