你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
æµ®ç¹æ°è¡¨ç¤º
串å£åé
查看全部评分
stm1024 发表于 2018-5-12 13:00 两种思路,供参考。 1. 原始字节 按原始字节数据发送,这也是我个人比较倾向的方式。
pythonworld 发表于 2018-5-12 05:08 串口发过来的是字符格式还是二进制格式?解析方式应该不同。
两种思路,供参考。
1. 原始字节
按原始字节数据发送,这也是我个人比较倾向的方式。首先,位、字节和字节流本身没有任何意义,如果按约定的方式去解析,才能有具体的含义。
用什么约定方式呢?使用符合IEEE 754的浮点数标准,每个浮点数为4个字节,按标准解析就可以了。
其实这个标准,包括STM32在内的很多微控制器,都是支持的,内部的表达方式都是一致的,而且效率很快。
技巧就是定义好一个联合体,这一步很关键:
æµ®ç¹æ°è¡¨ç¤º
这个是浮点数的表示形式,123.456按IEEE754的规范,表示成十六进制就是42 F6 E9 79。
然后使用串口程序发送给STM32:
串å£åé
两个注意的地方:
a. 浮点数是近似表示,所以你看STM32解析的是123.456001,而不是精确的123.456,这并不违反IEEE 754标准,尤其是涉及到最后一个bit的四舍五入方法,在IEEE 754 中并没有明确规定。
b. 字节顺序和对齐。你所有的工作只是定义好联合体,然后填充好联合体,STM32会自动替你完成转换。不过需要注意的是,一些上位机采用的是大端对齐的方式, 发送的字节顺序会相反。
2. 字符串方式
如果是字符串或者其他方式发送,那就可以自定义一套转换机制,甚至你的上位机在发送2/5的分数,或者40%这样的字符串,都可以解析为0.4的浮点数,这种方式的灵活度非常高,但是对编程要求更复杂,而且相对而言,比较占用MCU的CPU时间和Flash。
评分
查看全部评分
#include<stdio.h>
int main()
{
double d;
char str[] = "123.456";
d=atof(str);
printf("string=%s,double=%lf\n",str,d);
return 0;
}
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
浮点小数是32位,当然要化成4个字节的格式分4次发送
评分
查看全部评分
评分
查看全部评分
非常感谢,受益匪浅,谢谢!
您能这两种都给我介绍一下吗?