你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
各位大哥大姐 ,给我来个串口发送float型数据的例程
[复制链接]
黄家村村长
提问时间:2018-6-1 18:07 /
阅读主题, 点击返回1楼
赞
0
收藏
0
评论
10
分享
发布时间:2018-6-1 18:07
请先
登录
后回复
10个回答
stm1024
回答时间:2018-6-2 15:35:29
a0a.1 32b0c
本帖最后由 stm1024 于 2018-6-4 11:34 编辑
串口发送,直接把float数据的四个字节送出去就行了 。介绍两个最简单经济的做法,思想类似,效率也很高。
当然前提是假设您的USART1设置工作已经做好了。=========================================================================
1.联合体
这种方式比较容易理解,就是让不同的变量在内存中具有重叠,然后分别读取。
union FB
{
float f;
uint8_t b[4];
};
复制代码
然后可以这么使用:
union FB fb;
uint8_t i;
fb.f=123.456f;
for(i=0;i<4;i++)
{
USART1->SR;
USART_SendData(USART1, fb.b[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
复制代码
这种方式比较容易理解,也不容出错,但是比较编译后代码肯定是要大一点的。
2.强制类型转换
就是将float类型强制理解为四个字节的字节流,这种方式简单粗暴,也是我比较喜欢的
。
float f=123.456f;
uint8_t i;
uint8_t *pf=(uint8_t*)(&f);
for(i=0;i<4;i++)
{
USART1->SR;
USART_SendData(USART1,pf[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
复制代码
玩指针是最爽的,就是要小心点。
截图看一下,两者效果差不多。
79 E9 F6 42 就是按IEEE754表示的浮点数123.456,不过,需要说明的是,顺序与特定机器(CPU)有关。例如,用我写的程序测试:
网站:
http://www.binaryconvert.com/res ... 9050051046052053054
显示的结果如下:
从这里可以看出,
STM32是Little-Endian的
。
反正用这两种搞法,别说一个小小的float类型,就是复杂的自定义类型,都能给你化整为零发出去,然后在接收端按约定好的字节流顺序,一个memcpy又能在接收端满血满魔复活。
串口接收float,这里有个可供参考:
https://www.stmcu.org.cn/module/foru ... ewthread&tid=615818
评分
参与人数
1
蝴蝶豆
+5
收起
理由
zero99
+ 5
查看全部评分
赞
0
评论
回复
支持
反对
1
2
/ 2 页
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
串口发送,直接把float数据的四个字节送出去就行了 。介绍两个最简单经济的做法,思想类似,效率也很高。
当然前提是假设您的USART1设置工作已经做好了。=========================================================================
1.联合体
这种方式比较容易理解,就是让不同的变量在内存中具有重叠,然后分别读取。
2.强制类型转换
就是将float类型强制理解为四个字节的字节流,这种方式简单粗暴,也是我比较喜欢的。
截图看一下,两者效果差不多。
79 E9 F6 42 就是按IEEE754表示的浮点数123.456,不过,需要说明的是,顺序与特定机器(CPU)有关。例如,用我写的程序测试:
网站:http://www.binaryconvert.com/res ... 9050051046052053054显示的结果如下:
从这里可以看出,STM32是Little-Endian的。
反正用这两种搞法,别说一个小小的float类型,就是复杂的自定义类型,都能给你化整为零发出去,然后在接收端按约定好的字节流顺序,一个memcpy又能在接收端满血满魔复活。
串口接收float,这里有个可供参考:https://www.stmcu.org.cn/module/foru ... ewthread&tid=615818
评分
查看全部评分