完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做毕业设计,在做wifi数据传输与接收时,涉及到了STM32单片机中的数据转换问题,经过一系列查资料终于解决了这个烦人的问题!!!! 其中涉及了WiFi的数据传输和WiFi的数据接收: 1. WiFi的数据传输(float->u32->u8) WiFi数据传输时,因为使用的是NRF24L01模块,其官方代码是传输的u8类型的数组,但是我需要传输的是经纬度(float类型),所以要对数据进行转换。 1. float->u32 如果使用强转,会导致精度严重损失,所以我这里采用union联合体,来降低精度的损失。这样不仅降低了精度的损失,而且也解决了float转u32和u32转float的问题。原因是他们共用同一地址,而且都是占32位的。 typedef union { float a; uint32_t b; }Data; 2. u32->u8(涉及到位操作) 左移运算符(<<)。 定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。 右移运算符(>>) 定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。 操作数每右移一位,相当于该数除以2。 int main(){ //中国 经度范围:73°33′E至135°05′E 纬 度范围:3°51′N至53°33′N uint8_t tmp_buf[4]; Data E,N; E.a = 118.2972336; //N.b = 1122801711; // WiFi传输 // 演示示例,省略了帧头帧尾和16位校验位 tmp_buf[0]=(E.b>>16)>>8; // 取高16位中的高8位 tmp_buf[1]=(E.b>>16)&0xff; // 取高16位中的低8位 tmp_buf[2]=(E.b&0xffff)>>8; // 取低16位中的高8位 tmp_buf[3]=(E.b&0xffff)&0xff; // 取低16位中的低8位 printf("%xn",E.b); for(int i=0;i<4;++i){ printf("%x",tmp_buf); cout << endl; } return 0; } 2. WiFi的数据接收(u8->u32->float) 在WiFi接收到数据后再将数据逆转即可。 int main(){ //中国 经度范围:73°33′E至135°05′E 纬 度范围:3°51′N至53°33′N /*uint8_t tmp_buf[20]; Data E,N; E.a = 118.2972336; //N.b = 1122801711; // WiFi传输 演示示例,省略了帧头帧尾和16位校验位 tmp_buf[0]=(E.b>>16)>>8; // 高16位中的高8位 tmp_buf[1]=(E.b>>16)&0xff; //高16位中的低8位 tmp_buf[2]=(E.b&0xffff)>>8; // 低16位中的高8位 tmp_buf[3]=(E.b&0xffff)&0xff; // 低16位中的低8位 printf("%xn",E.b); for(int i=0;i<4;++i){ printf("%x",tmp_buf); cout << endl; } */ // WiFi接收 Data res; //res.b = (tmp_buf[0]*pow(2,24)+tmp_buf[1]*pow(2,16)+tmp_buf[2]*pow(2,8)+tmp_buf[3]); res.b = (tmp_buf[0]<<24)+(tmp_buf[1]<<16)+(tmp_buf[2]<<8)+tmp_buf[3]; printf("%xn%f",res.b,res.a); cout << endl; return 0; } 加油加油!!!!! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 02:17 , Processed in 0.866985 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号