你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

各位大哥大姐 ,给我来个串口发送float型数据的例程

[复制链接]
黄家村村长 提问时间:2018-6-1 18:07 /
各位大哥大姐  ,给我来个串口发送float型数据的例程      
收藏 评论10 发布时间:2018-6-1 18:07

举报

10个回答
七哥 回答时间:2018-6-2 00:25:27
本帖最后由 toofree 于 2018-6-2 00:32 编辑
黄家村村长 发表于 2018-6-1 19:10
我要这种思路的  

//发送16位的数据     

不早说,51时这么用的比较多。
//发送float数据
void usart_send_float(float value)
{
   float v_float;
   unsigned char * char_p;
   unsigned char i;

   v_float = value;
   char_p = (unsigned char *)(&v_float );

   for (i=0;i<4;i++)
  {   
   USART_SendData8(USART1, *char_p );
   while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  }
}

//float是32位的数,但是double却不一定。改个double的

void usart_send_double (double value)
{
   double v_double;
   unsigned char * char_p;
   unsigned char i,num;

   v_double  = value;
   char_p = (unsigned char *)(&v_double );
   num = sizeof(double);

   for (i=0;i<num ;i++)
  {   
   USART_SendData8(USART1, *char_p );
   while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  }
}




评分

参与人数 2ST金币 +2 蝴蝶豆 +4 收起 理由
zero99 + 4
MrJiu + 2 很给力!

查看全部评分

shanji 回答时间:2018-6-1 18:17:53
float num=3.14;
printf("\r\nnum=%f\r\n",num);

评分

参与人数 2ST金币 +2 蝴蝶豆 +2 收起 理由
zero99 + 2
MrJiu + 2 赞一个!

查看全部评分

黄家村村长 回答时间:2018-6-1 19:10:55
shanji 发表于 2018-6-1 18:17
float num=3.14;
printf("\r\nnum=%f\r\n",num);

我要这种思路的  

//发送16位的数据     
void usart_send_value(uint16_t value)
{
   unsigned char temph;
   unsigned char templ;
   temph=(value&0xff00)>>8;
   templ=value&0x00ff;
   USART_SendData8(USART1, temph);
   while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
   USART_SendData8(USART1, templ);
   while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);   
}
随风飘扬 回答时间:2018-6-1 20:54:00
如果是发给其他的STM32的话,可以直接这样用的
uart_send_chars(uint8_*value, uint16_t length);
float tempf;
uart_send_chars((uint8_t *)&tempf, sizeof(float));

如果发给其他的单片机或计算机,就要确定一下浮点表示的标准是不是一样的,如果是一样的也可以这样发

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

电子星辰 回答时间:2018-6-1 21:36:05
你要发送是很简单的,直接float TxBuffer=3.14;printf("%f",TxBuffer);就可以了。倒是接受要复杂些。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

黑皮男 回答时间:2018-6-2 07:48:08


发送:
float data = 1.2f;
uint8_t buf[10];
memcpy(buf, &data, sizeof(float));
serial_write(buf, sizeof(float));
接收:
uint8_t buf[10];
float data;
serial_receive(buf, sizeof(float));
memcpy(&data, buf, sizeof(float));

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

anobodykey 回答时间:2018-6-2 08:41:00
如果发送端和接收端的浮点数表示方法一样就可以用普通的发送方法,如果两端不同的话可以使用转成字符串形式,接收端再从字符串转成浮点数

评分

参与人数 2ST金币 +2 蝴蝶豆 +3 收起 理由
zero99 + 3
MrJiu + 2

查看全部评分

黄家村村长 回答时间:2018-6-2 09:01:14
电子星辰 发表于 2018-6-1 21:36
你要发送是很简单的,直接float TxBuffer=3.14;printf("%f",TxBuffer);就可以了。倒是接受要复杂些。 ...

西点钟灵毓秀 回答时间:2018-6-2 11:06:25
先扩大1000倍,转变成int或者long型,就可以加到数据帧里面了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

STM1024 回答时间:2018-6-2 15:35:29
本帖最后由 stm1024 于 2018-6-4 11:34 编辑

串口发送,直接把float数据的四个字节送出去就行了 。介绍两个最简单经济的做法,思想类似,效率也很高。
当然前提是假设您的USART1设置工作已经做好了。=========================================================================

1.联合体
这种方式比较容易理解,就是让不同的变量在内存中具有重叠,然后分别读取。
  1. union FB
  2. {
  3.     float f;
  4.     uint8_t b[4];
  5. };
复制代码
然后可以这么使用:
  1. union FB fb;
  2.     uint8_t i;
  3.     fb.f=123.456f;
  4.     for(i=0;i<4;i++)
  5.     {
  6.         USART1->SR;
  7.         USART_SendData(USART1, fb.b[i]);
  8.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
  9.     }
复制代码
这种方式比较容易理解,也不容出错,但是比较编译后代码肯定是要大一点的。

2.强制类型转换
就是将float类型强制理解为四个字节的字节流,这种方式简单粗暴,也是我比较喜欢的
  1. float f=123.456f;
  2.     uint8_t i;
  3.     uint8_t *pf=(uint8_t*)(&f);
  4.     for(i=0;i<4;i++)
  5.     {
  6.         USART1->SR;
  7.         USART_SendData(USART1,pf[i]);
  8.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
  9.     }
复制代码
玩指针是最爽的,就是要小心点。

截图看一下,两者效果差不多。
2018-06-02_162906.jpg
79 E9 F6 42 就是按IEEE754表示的浮点数123.456,不过,需要说明的是,顺序与特定机器(CPU)有关。例如,用我写的程序测试:
2018-06-02_163321.jpg
网站:http://www.binaryconvert.com/res ... 9050051046052053054显示的结果如下:
2018-06-02_163154.jpg
从这里可以看出,STM32是Little-Endian的
反正用这两种搞法,别说一个小小的float类型,就是复杂的自定义类型,都能给你化整为零发出去,然后在接收端按约定好的字节流顺序,一个memcpy又能在接收端满血满魔复活。

串口接收float,这里有个可供参考:https://www.stmcu.org.cn/module/foru ... ewthread&tid=615818







评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版