关于单片机通过串口发送浮点数信息

最近弄一个小东西的时候,需要将AD采集的数据,通过串口发送上位机。由于还得在下位机部分显示出来,所以这个AD采集的数据转换之后发送到串口,比较容易点。但是问题来了,以前的串口,只有从GPS模块接收的信息是浮点类型外。其他的东西,都只是把字符类型或者字符串类型的数据发到串口。
查阅了一点资料,这里是资料的链接。
单片机将浮点数从串口发送出去:
1.http://www.51hei.com/bbs/dpj-31223-1.html
采用了将浮点数转换为四个字节的数据,放到数组中,发送到串口。
2.http://blog.sina.com.cn/s/blog_a8576df901011efv.html
加入了标准输入输出头文件,可以通过对TI标志位的判断,直接对数据进行串口输出。
同时自己进行了一个测试,觉得第二种方法比第一种方法来的简单。但是第二种多了一个头文件,大概估计了一下,觉得第二种方法生成的hex文件是比第一种大的。当然现在很多存储都是够的。倒也不是什么大问题,不过大家进行方法选择的时候,可以进行一些测试,以免存储不够的情况出现。

下面是我进行测试的代码

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

float ad_vo=9.0987;
void init()
{
    //设定T1定时器工作方式2, T0定时器工作方式1
    TMOD = 0x21;
    //为T0定时器装入初值
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    //为T1定时器装入初值
    TH1 = 0xfd;
    TL1 = 0xfd;
    //ET1 = 1;  这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做
    //启动T1定时器
    TR1 = 1;
    //开启定时器0中断
    ET0 = 1;
    //启动定时器0
    //TR0 = 1; TR0的初始化放在主函数的while中,方便检测到串口发送数据后的1s延时,即延时1s从串口发送完数据开始
    //设定串口工作方式
    //11位异步收发,含9位数据,波特率可变,且由定时器1溢出率控制
    SM0 = 1;
    SM1 = 1;
    //容许串口中断
    REN = 1;
    //开启总中断
    EA = 1;
    //开启串口中断
    ES = 1;
}
void delay(uint count)
{
    uint i=0,j=0;
    for(i=count;i>0;i--)
        for(j=110;j>0;j--);
}

void main()
{
    while(1)
    {
      delay(1000);
      init();
      ES=0;
      TI=1;
      printf("%f\n",ad_vo);
      printf("\n\n\n\n");
      while(!TI);
      TI=0;
      ES=1;
      delay(1000);
    }
}
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用类似下面的程序实现点数和IEEE754格式数据之间的转换,并通过串口发送出去: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdbool.h> union FloatToHex { float f; uint32_t hex; }; void floatToHex(float f, uint8_t *buf) { union FloatToHex fh; fh.f = f; for (int i = 0; i < 4; i++) { buf[i] = (fh.hex >> (i * 8)) & 0xFF; } } float hexToFloat(uint8_t *buf) { union FloatToHex fh; fh.hex = ((uint32_t)buf[0] << 24) | ((uint32_t)buf[1] << 16) | ((uint32_t)buf[2] << 8) | buf[3]; return fh.f; } int main() { float f = 20.5; uint8_t buf[4]; floatToHex(f, buf); printf("float value: %f\n", f); printf("IEEE754 hex value: 0x%08X\n", *((uint32_t*)buf)); // 通过串口发送buf // ... // 接收串口数据存放到buf中 // ... float receivedF = hexToFloat(buf); printf("received float value: %f\n", receivedF); return 0; } ``` 在这个程序中,我们定义了一个联合体`FloatToHex`,其中包含一个`float`类型的成员变量`f`和一个`uint32_t`类型的成员变量`hex`。我们使用`floatToHex`函数将点数转换成IEEE754格式的数据,并存放到`buf`数组中。`hexToFloat`函数实现了将IEEE754格式数据转换成点数的功能。在主函数中,我们定义一个点数`f`,并通过`floatToHex`函数将它转换成IEEE754格式的数据,并输出转换结果。然后我们模拟通过串口发送`buf`数组,并接收到一个长度为4的数据包,将接收到的数据存放到`buf`数组中,并通过`hexToFloat`函数将`buf`数组中的数据转换成点数,并输出转换结果。 需要注意的是,这个程序中的点数和IEEE754格式数据之间的转换是按照大端模式实现的,对于不同的单片机系统可能需要进行适当的修改。同时,在实际应用中,需要根据串口通信的协议来发送和接收数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值