完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
方法一:指针
UART串口有一个缺点,就是发送和接受是一个字节一个字节的接收,如果发送的浮点数那可怎么办啊? 有人会说,那就一个字节一个字节发送啊。那么,我先定义一个double data。32位机中,一个double类型占8个字节,也就是说data需要拆分8块通过UART发送。 现在只有一个变量,那么就声明一个指针指向这个变量吧 double *p; p = &data; p会将8个字节当成一个整体,这样p+1就不能指向下一个字节的地址了 那么如果我将p强转成 unsigned char *呢?或者我们声明一个unsigned char * 指向这个data unsigned char *q; q = (unsigned char *)p; 那么串口发送就用一个for循环就够了 for(i=0;i<8;i++) { send(*(q+i)); } 接收方先用一个数组将数据从低位开始接收,再使用一个double指针强行指向数组头就行了,下面这段代码是模拟串口发送前后数据拆分组合的过程 vs2010 方法二:联合体 方法一太繁琐了,有没有简单点的办法? 利用联合体(共同体)有多简单? #include "stdafx.h" #define MAX_LENTH 8 union U1 { char s[MAX_LENTH]; double d; }; union U2 { char s[MAX_LENTH]; double d; }; int _tmain(int argc, _TCHAR* argv[]) { U1 u1; U2 u2; int i=0; u1.d = 2.111; u2.d = 3.00; printf("u1.d = %lfn",u1.d); printf("u2.d = %lfn",u2.d); printf("Send Data..."); for(i=0;i u2.s = u1.s; } printf("u2.d = %lfn",u2.d); while(getchar()=='q'); return 0; } 方法一简直就是浪费脑力啊! vs2010结果 为什么联合体会这么神奇呢? 因为它的所有成员相对于基地址的偏移量都为0 也就是说 双精度浮点数地址 &u1.d 与数组首地址 u1.s是一样的 其实方法一的方法和联合体的思想是一样的,利用了数组保存接收的数据(数据的实质就是内存存储二进制),将一个指向double的指针指向这份数组的首地址,那么我们通过取值符号*将这份数据完好无缺的读出来了啊!只不过联合体中double的地址就是数组首地址 ,不需要像方法一那样强转! |
|
|
|
只有小组成员才能发言,加入小组>>
3263 浏览 9 评论
2944 浏览 16 评论
3443 浏览 1 评论
8955 浏览 16 评论
4036 浏览 18 评论
1078浏览 3评论
558浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
551浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2286浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1848浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 14:49 , Processed in 0.849229 second(s), Total 47, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号