高手进__关于上位机和单片机协议通讯问题(分不够我再补!)

xiaoniao2636 2006-07-27 11:17:23
代码:(c#)
tInfo = new byte[Marshal.SizeOf(time[0])]//tInfo初始化 time[]已知,然后调用下面这个方法
public static void CopyMemory(byte[] Destination, tTime[] Source, int Length)
{
  System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
   System.IO.MemoryStream stream = new System.IO.MemoryStream();
   bFormat.Serialize(stream, Source);
  stream.Read(Destination, 0, Destination.Length)
  stream.Close();
}

说明:tTime[] Source是自定义的数据结构;这个是本人模拟windows的copymemory这个api实现把内
存的数据结构存储到byte数组的方法。

目的:copymemory不安全,用这个方法实现,把内存的数据结构保存到byte数组(还要对数组进行操作计算校验码),然后通过一个协议封包,通过tcp/ip协议转发到单片机,单片机解析出数据,完成特定的功能。

问题:这种方法能不能够把内存中的数据拷贝到byte数组中,变成单片机识别的数据结构,单片机用c
开发的;我这个把对象化为byte数组的方法好不好,有什么好的方法给个建议;或者给说一下
对象序列化是怎样工作的;

注: 原来的使用windows的copymemory这个api可以和单片机通讯




网友建议:不要用序列化,单片机不认识的
c#可以用指针把1个结构转换成byte数组。
转换的时候要注意几点
1。结构里不能有数组,类,字符串之类的东西
2. 单片机的字节对齐方式和字节顺序
比如
private unsafe void Test()
{
int test = 0;
int* pint = &test ;

byte* pdata = ( byte* ) pint;
int dataLength = sizeof ( int );
byte[] body = new byte[dataLength];
for ( int i = 0; i < body.Length; i++ )
body[ i ] = *( pdata + i );
}

...全文
235 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
JasonHeung 2006-07-27
  • 打赏
  • 举报
回复
byte[] buf = new byte[len];
System.IO.MemoryStream stream = new System.IO.MemoryStream(buf);
stream.Write(data);//依次写入各个数据
//buf中就是你的数据
阿牛138588 2006-07-27
  • 打赏
  • 举报
回复
转为byte是正确的,网络发送好像只能用流数据?
lisigang 2006-07-27
  • 打赏
  • 举报
回复
我讲以下我的看法,在通讯中使用copymemory是有一定的优势的,无论上位机还是单片机都不会在有对数据拆分,对内存进行操作的问题,直接把byte数组用copymemory转换成结构体那样的话,内存中的数据就可以直接使用了,这说明协议有一定的优势比单独规定数据位的意义,如果LZ要把结构体自己写到byte[]中的话要做的工作有多麻烦吗?结构体在内存中存贮不是想象的那样,会对数据有合并,比如char和short两个变量在一起的时候在内存中占4个字节,而不是6个!
lisigang 2006-07-27
  • 打赏
  • 举报
回复
对于这个我也有兴趣 帮你顶一下!
lisigang 2006-07-27
  • 打赏
  • 举报
回复
我想LZ问的是到底类库里把对象序列化为流的时候做了什么?流里面到底存了什么,什么规则存的,是不是对内存的简单的拷贝转化为流,还是流中存储了关于对象的其他信息,如果还存了其他的信息那么我就用不了了,因为单片机不会识别?
Knight94 2006-07-27
  • 打赏
  • 举报
回复
to 对象序列化的方法转成byte数组,行吗??一口咬死说不行的话,我就不做那方面的测试了,直接自己写了!

你要明白通信是双方的事情,即发送方和接收方。
例如在发送方把“ABC”转换成“123”进行发送,那么接收方接收到“123”能明白发送的内容是“ABC”。

否则相当于发送方作无用功。
xiaoniao2636 2006-07-27
  • 打赏
  • 举报
回复
帮帮了困惑一个星期咯!
xiaoniao2636 2006-07-27
  • 打赏
  • 举报
回复
对象序列化的方法转成byte数组,行吗??一口咬死说不行的话,我就不做那方面的测试了,直接自己写了!
Knight94 2006-07-27
  • 打赏
  • 举报
回复
自己写代码进行实现,也就是把struct或者class定义的类型转换成byte[],需要你编程实现。

其中c#提供了BitConverter以及Encoding这两个类可以进行转换。

在转换之前,你最好能了解传出什么样的byte[]能在上位机和单片机那边转换成对象。
xiaoniao2636 2006-07-27
  • 打赏
  • 举报
回复
谢谢楼上的,多给我一个方法!,也就是说我把 自己定义的数据接构里的每一个项都一个一个的付进去是吗?如果说基构体中还包含结构体,那样会很繁琐,有直接把对象化成byte[]的方法吗?但是不使用不安全代码~!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧