首页 新闻 搜索 专区 学院

c# 串口传输数据

0
悬赏园豆:50 [已解决问题] 解决于 2015-12-21 11:10

c#的数据结构 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]中因为单片机传给我的sizeconst不固定,我应该怎么设定这个结构体中数组字段的sizeconst?

时光cc的主页 时光cc | 初学一级 | 园豆:50
提问于:2015-12-18 17:39
< >
分享
最佳答案
0

传的不是二进制流吗,取到二进制流了解析不久好了。你们规定的通信协议是什么样的

收获园豆:50
吴瑞祥 | 高人七级 |园豆:28979 | 2015-12-18 17:49

我收到的是二进制流,我接收完成了,单片机是以结构体的形式体现的,我这里要把二进制流转换成结构体,但是MarshalAs的sizeconst因为传输的是不固定的, 我还没接收数据的时候并不知道,结构体的sizeconst该怎么设置

时光cc | 园豆:50 (初学一级) | 2015-12-21 10:12

@时光cc:可以定义一个最大长度,那边也以最大长度传,然后再加个长度字段,用来告诉你这个字段到底有多少位。

真正解决是解决不了的。除非你再定义一个协议,在包开头传输先传输结构体描述,多少位到多少位是哪个字段,什么类型,这种解决方案还不如让单片机那边以你指定的方式序列化后再传,

PS:我很喜欢用json序列化传东西,简单方便

吴瑞祥 | 园豆:28979 (高人七级) | 2015-12-21 10:41

@吴瑞祥: 对的 一开始是定义了最大程度传送的,后面取消掉了,要改成不固定的

时光cc | 园豆:50 (初学一级) | 2015-12-21 10:59

@时光cc: 要看你们2个定义的通讯协议是怎么样的。还是选一个序列化协议吧,以结构体来说是不行的。

C里结构体是必须确定每个字段的长度的,

吴瑞祥 | 园豆:28979 (高人七级) | 2015-12-21 11:03

@吴瑞祥: 谢谢,我在去考虑下 然后看下序列化。

时光cc | 园豆:50 (初学一级) | 2015-12-21 11:11
其他回答(2)
0

一般做的和仪器数据传输格式都是类似这样的

数据包格式,如下

帧头

长度

命令ID

参数

Crc16

0xFA

 Len

 Cmd

xxxx

Crc16

1、帧头:数据包的固定的第一个数据;

2、长度:数据包的字节数总和:

3、命令:数据包的有效命令ID;

4、参数:该命令ID所附带的参数,如果没有参数不填充0x00;

5、Crc16:占2个字节,数据包的的CRC校验值;

jeenlee | 园豆:204 (菜鸟二级) | 2015-12-22 22:10
0

http://www.cnblogs.com/fengye87626/p/4173288.html 貌似我之前也遇到了同样的问题,映射到结构体的时候SizeConst必须是固定长度, 最后解决方法是先判断length的长度,再根据length长度截取后面的字段

我不是杰克船长 | 园豆:238 (菜鸟二级) | 2015-12-29 14:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册