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

来源:互联网 发布:淘宝店铺类目在哪里看 编辑:程序博客网 时间:2024/06/07 05:15

最近弄一个小东西的时候,需要将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 intfloat 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);    }}
0 0
原创粉丝点击