OpenEdv-开源电子网

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

如何从一个数组中取出一个16位的数据

[复制链接]

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
发表于 2018-11-5 10:57:06 | 显示全部楼层 |阅读模式
1金钱
有一个数组A[512],想从它里面每提取16位为一个新的数据,这样子要怎么操作呢?最后提取出来的数据应该是一个数据长度为16的数组B[255]

最佳答案

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

u16* B = (u16*)A; 之后B就是你想要的了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-5 10:57:07 | 显示全部楼层
u16* B = (u16*)A;
之后B就是你想要的了
回复

使用道具 举报

3

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2018-7-6
在线时间
68 小时
发表于 2018-11-5 12:55:21 | 显示全部楼层
用 for循环遍历一次就行了(例B[0]=(A[0]<<8|A[1]);)
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
 楼主| 发表于 2018-11-5 15:01:23 | 显示全部楼层
edmund1234 发表于 2018-11-5 11:12
u16* B = (u16*)A;
之后B就是你想要的了

这个B好像是一个指针,不是一个数组吧?
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
 楼主| 发表于 2018-11-5 15:02:06 | 显示全部楼层
1109058937 发表于 2018-11-5 12:55
用 for循环遍历一次就行了(例B[0]=(A[0]

这样子是不是要把B定义为u16类型的数组?
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
 楼主| 发表于 2018-11-5 15:03:34 | 显示全部楼层
1109058937 发表于 2018-11-5 12:55
用 for循环遍历一次就行了(例B[0]=(A[0]

我是串口接收过来的数据,可不可以直接把串口接收的数组u8 USART_RX_BUF[USART_REC_LEN]; 直接改为u16 USART_RX_BUF[USART_REC_LEN];?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-5 16:58:52 | 显示全部楼层
本帖最后由 edmund1234 于 2018-11-5 17:00 编辑
castle 发表于 2018-11-5 15:01
这个B好像是一个指针,不是一个数组吧?

这个B与A没分别, 数组定义的就是一个指针, 否则你认为A是什么类型? 你动手试一下就知道了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-5 17:03:54 | 显示全部楼层
数组的定义, 是编译器给你分配了数组所需要的空间, 然后把这空间的地址放在以数组命名的指针去, 所以A是指针, B也是指针
去翻一下有关数组的书引证一下我的讲法吧
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-5 17:11:24 | 显示全部楼层
本帖最后由 edmund1234 于 2018-11-5 17:18 编辑

其实你不搞多个B出来也行, 直接用A也可以把它转换为u16的数组操作, *((u16*)&A) = 0x1234; 原理是一样的, i必须是偶数
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
 楼主| 发表于 2018-11-5 17:31:17 | 显示全部楼层
edmund1234 发表于 2018-11-5 17:11
其实你不搞多个B出来也行, 直接用A也可以把它转换为u16的数组操作, *((u16*)&A) = 0x1234; 原理是一样的 ...

嗯嗯,我先看看数组的知识吧,c语言底子太差了
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2018-7-12
在线时间
34 小时
 楼主| 发表于 2018-11-5 17:34:51 | 显示全部楼层
castle 发表于 2018-11-5 17:31
嗯嗯,我先看看数组的知识吧,c语言底子太差了

还有能不能再问你一下,我是串口接收过来的数据,可不可以直接把串口接收的数组u8 USART_RX_BUF[USART_REC_LEN]; 直接改为u16 USART_RX_BUF[USART_REC_LEN];?这样子这个数据就是16位的了?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-5 17:44:53 | 显示全部楼层
本帖最后由 edmund1234 于 2018-11-5 17:49 编辑
castle 发表于 2018-11-5 17:34
还有能不能再问你一下,我是串口接收过来的数据,可不可以直接把串口接收的数组u8 USART_RX_BUF; 直接改 ...

你通过什么来接收数据? DMA?还是从USART->DR读出, 如果是后者, 你读出再写到buf时是u8, 把u8写到u16的数组还是要做转换, 只是这次从u16转到u8而已
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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