OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3643|回复: 10

STM32串口如何打包三个数组发送出去

[复制链接]

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-8-2
在线时间
12 小时
发表于 2018-8-10 09:56:15 | 显示全部楼层 |阅读模式
4金钱

最佳答案

查看完整内容[请看2#楼]

楼主的意思应该是,当数组的长度不知道的时候,如何传递这个数组吧。 一种参考的方案就是设计一个简单的协议,对于基本的u8型数组来说:一字节包头,一字节长度(限制了这个数组的最大长度为256)或者两字节长度(限制这个数组的最大长度为65536),然后后面跟变长的数组数据,最后跟一个校验和来判断是否 传输正确。如果是其他数据类型的数组,无论是int型long型float\double型,甚至是结构体类型,可以使用强制类型转换,例如 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-10 09:56:16 | 显示全部楼层
楼主的意思应该是,当数组的长度不知道的时候,如何传递这个数组吧。

一种参考的方案就是设计一个简单的协议,对于基本的u8型数组来说:一字节包头,一字节长度(限制了这个数组的最大长度为256)或者两字节长度(限制这个数组的最大长度为65536),然后后面跟变长的数组数据,最后跟一个校验和来判断是否 传输正确。如果是其他数据类型的数组,无论是int型long型float\double型,甚至是结构体类型,可以使用强制类型转换,例如已知一个float型数据占4字节,那么在发送端可以这样拆分:

[mw_shl_code=c,true]float arr[10];

u8 *sendPointer=(u8*)arr;

//此时sendPointer就可以看作是指向一个长度40的u8数组首地址的指针了[/mw_shl_code]

然后接收端先接收到一个u8数组recv里面,然后相反的操作即可:

[mw_shl_code=c,true]u8 recv[40];

...

//接收完成了,开始转换
float *arr=(float*)recv;

//然后就可以以float数组的方式,通过arr访问这个数组了[/mw_shl_code]
十六进制带我飞。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-10 10:33:23 | 显示全部楼层
不管它几个数组,
最终都是一个一个的字节,
按顺序逐一发送出去有什么问题吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-8-2
在线时间
12 小时
 楼主| 发表于 2018-8-10 10:45:54 | 显示全部楼层
单片机接收3个陀螺仪的数据,总共三个数组,实时发送出去,并能区分出三个数组是哪个陀螺仪的数据,想一次把三个数组的数据都发出去
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-8-2
在线时间
12 小时
 楼主| 发表于 2018-8-10 10:47:35 | 显示全部楼层
童话WN 发表于 2018-8-10 10:45
单片机接收3个陀螺仪的数据,总共三个数组,实时发送出去,并能区分出三个数组是哪个陀螺仪的数据,想一次 ...

这样便于区分数据
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2018-8-10 10:54:21 | 显示全部楼层
每个数组的首位加个字段标记一下,然后合并成一个发送出去,接收端再来进行分解。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-10 10:56:37 | 显示全部楼层
自己定个简单的协议啊...有什么难的
猪猪熊呢?
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-8-2
在线时间
12 小时
 楼主| 发表于 2018-8-10 11:00:59 | 显示全部楼层
sodermalm 发表于 2018-8-10 10:54
每个数组的首位加个字段标记一下,然后合并成一个发送出去,接收端再来进行分解。

多谢。。。。。
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2018-8-10 11:28:04 | 显示全部楼层
只要确认你的每组数据个数有多少就好了,一起发出去,接收的时候按照你发送的数据解析就好了,不要加什么标志的。
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-8-10 15:59:00 | 显示全部楼层
xlong_06 发表于 2018-8-10 11:28
只要确认你的每组数据个数有多少就好了,一起发出去,接收的时候按照你发送的数据解析就好了,不要加什么标 ...

赞同你和2楼的说法
没有脑袋
回复

使用道具 举报

8

主题

572

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2930
金钱
2930
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-8-10 16:23:56 | 显示全部楼层
自己定一个通信协议不就好了么。比如用TLV格式的数据进行通信。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 01:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表