输入单片机的串口需接收的是整型还是整型浮点型字符型数

查看: 14601|回复: 15
串口发送浮点型数据的话要怎么处理?
主题帖子精华
新手上路, 积分 35, 距离下一级还需 15 积分
在线时间0 小时
串口发送浮点型数据的话要怎么处理?,把一个浮点型数据拆成四个八位的数据来发送吗? &这样分开发送的话数据的话,那我在上位机处理单片机发送的数据的时候因为数据是一直在不停的发不停的收的,我怎么知道要把哪四个数据在结合起来呢?
printf("%f\r\n",fx);
fx就是浮点数.
主题帖子精华
金钱131528
在线时间1206 小时
printf("%f\r\n",fx);
fx就是浮点数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
在线时间10 小时
你要发送原始数据流&还是&格式化输出?
如果是格式化&按原子说的&,用sprintf&/&
如果发送原始内存数据流,&可按下面发送,
float&a&=&1.23;&double&b=3.2;
SendBytes(&*(u8*)&a&,sizeof(a)&);&
SendBytes(&*(u8*)&b&,sizeof(b)&);&
上位机接到的&十六进制码,再按同样格式转回来。
&如 分别接收到 &s1[4] s2[8] 里面, 如果是float 就是4个字节
*(float*)&s1 就是 a
*(double*)&s2 就是b
主题帖子精华
新手上路, 积分 35, 距离下一级还需 15 积分
在线时间0 小时
回复【3楼】aleda303:
---------------------------------
恩我用了sprintf&/&
主题帖子精华
初级会员, 积分 111, 距离下一级还需 89 积分
在线时间0 小时
回复【3楼】aleda303:
---------------------------------
学习了!!&&正好同求这个
想问下,我用NRF24L01&将&&FLOAT型数据&发送过去&&
先sprintf语句&将&float型数据&转化成一个字符数组
到了下位机要如何&转化回来float型
Stm32 F0/F103
主题帖子精华
在线时间10 小时
回复【5楼】psrazil:
---------------------------------
&反向&解析回来。
StrToInt&
StrToFloat
主题帖子精华
初级会员, 积分 111, 距离下一级还需 89 积分
在线时间0 小时
回复【6楼】aleda303:
---------------------------------
好的&&谢谢啊
Stm32 F0/F103
主题帖子精华
新手上路, 积分 31, 距离下一级还需 19 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
原子哥&我用printf发送浮点型数组&为什么会不显示小数点啊?
主题帖子精华
金钱131528
在线时间1206 小时
回复【8楼】frf:
---------------------------------
设置有问题吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
中级会员, 积分 409, 距离下一级还需 91 积分
在线时间19 小时
printf(&%f\r\n&,fx);
fx就是浮点数.
原子哥,您好,串口发送浮点数据,按您的方法来做,printf(&%f\r\n&,fx); fx是浮点数,程序直接卡死了,是什么原因呢?
主题帖子精华
初级会员, 积分 146, 距离下一级还需 54 积分
在线时间16 小时
你要发送原始数据流&还是&格式化输出?
如果是格式化&按原子说的&,用sprintf&nbs ...
float a = 1.23; double b=3.2;
SendBytes( (u8*)&a ,sizeof(a) );&&
SendBytes( (u8*)&b ,sizeof(b) );&&
应该是这样吧?
主题帖子精华
金牌会员, 积分 1614, 距离下一级还需 1386 积分
在线时间396 小时
要是要求保留小数点后面的位数不是很多的话,可以乘以10或者100就可以发送整数的形式发送了
yuhuofei 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽
主题帖子精华
新手入门, 积分 5, 距离下一级还需 15 积分
在线时间2 小时
printf(&%f\r\n&,fx);
fx就是浮点数.
printf(&%f\r\n&,fx); 这个函数是正点原子自己声明定义的吗,还是什么?我怎么找不到这个函数定义的地方
主题帖子精华
中级会员, 积分 491, 距离下一级还需 9 积分
在线时间126 小时
printf(&%f\r\n&,fx); 这个函数是正点原子自己声明定义的吗,还是什么?我怎么找不到这个函数定义的地方
这个是重定义函数,具体在标准输入输出库中,stdio.h
主题帖子精华
新手入门, 积分 16, 距离下一级还需 4 积分
在线时间1 小时
你要发送原始数据流&还是&格式化输出?
如果是格式化&按原子说的&,用sprintf&nbs ...
SendBytes是哪里的函数,怎么没找到。和printf一样吗?
必看:"原子哥”力荐 /1
千讲STM32视频,文档覆盖STM32F1~STM32H7,数百个原创实例,让你一次嗨个够!
Powered by21ic官方微信-->
电脑(PC)通过串口向单片机发送浮点数(float、double)的方法
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
电脑(PC)通过串口向单片机发送浮点数(float、double)的方法version1.0maswellxiao& && && &在实际应用中我们可能会遇到这样一个问题,PC机要向单片机发送一个浮点数,float类型、double类型也好。maswell我曾经做过AD转换并发送数据到MATLAB中做FFT、滤波器等数字信号处理。处理完毕以后maswell我遇到一个非常棘手的问题……MATLAB数据处理完毕以后得到的数据类型是小数类型,就算忽略后几位精度,最起码也是一个float数据类型的数,怎么把这个数发送到单片机呢?& && && &经过几天的折腾。maswell我一不小心就实现PC通过串口向单片机发送浮点小数。下面把这种方法分享给大家。& && && &首先我们需要一个预备知识。也就是float数据类型在单片机中的存储方式。& && && &float数据类型总共占据32个位bit,其中第一个位为数据符号(Symbol,在下面简称为S)该位表示数据的正负性。接下来8个位是阶码(Expoent,下面简称为E),这8个位表示浮点数的小数点的位置。最后有23位的尾数(mantissa,M),这23个位表示数据。下面做个示意图&&1位S&&8个位E23个位M& && && &例如:十进制的数据Nfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png将之换成二进制表示file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.png因此file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.png并由公式file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.png得file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.png组合起来就是&&S&&EM0file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.png4bit一格隔开&&0100&&001011110110111010010111100142F6E979因此十进制浮点小数N = 123.456在单片机里存储的数据为0x42F6E979& && && &
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
中级技术员, 积分 114, 距离下一级还需 186 积分
至此,我们的思路有了一点了。PC机向单片机发送十六进制代码0x42F6E979就意味着向单片机发送浮点小数123.456了。
下面是MATLAB向单片机发送数据的一段代码
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject& & handle to pushbutton7 (see GCBO)
% eventdata&&reserved - to be defined in a future version of MATLAB
% handles& & structure with handles and user data (see GUIDATA)
global TxDataToMSP430;
TxDataHex = num2hex(single(TxDataToMSP430));
fwrite(s,'dcba','uchar');%协议密码
& & if fread(s,1) == hex2dec('af');
& & if etime(clock , t1) & 1%1秒钟内未收到数据则放弃
TxDataHexTemp(1) = TxDataHex(1);
TxDataHexTemp(2) = TxDataHex(2);
fwrite(s,base2dec(TxDataHexTemp,16),'uchar');%协议数据
& && && &我当初做的是一个GUI界面,函数名是MATLAB自动生成的,我的下位机用的是MSP430G2553单片机。编译环境CCS5.2
volatile float DisplayData1,DisplayData2,DisplayData3,DisplayData4;
volatile long DisplayD//接收到的数据转换前数据
unsigned char TXVolFlag = 0;
static char FrameHeaderFlag = 1;//识别帧头标志位
static char StopTxFlag = 0;//上位机发送停止发送标志
unsigned char ReadDataClassFlag = 0x00;//读数据包格式
& && && &以上为全局变量。注意DisplayData为long数据类型
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
& & static char k = 0;
& & if(FrameHeaderFlag)
& && &&&ReadDataClassFlag = IdentifyHeader();
& && &&&if(ReadDataClassFlag != 0x00)//识别帧头
& && && && &FrameHeaderFlag = 0;
& & else//上一次读到的temp不是0,说明握手成功
& && &&&switch(ReadDataClassFlag)
& && &&&case 0xaf:
& && &&&case 0xbe:
& && &&&case 0xcc:
& && &&&case 0xdb:
& && && && &switch(k)
& && && && &{
& && && && &case 0:
& && && && && & DisplayData = UCA0RXBUF;
& && && && && & DisplayData &&= 8;
& && && && && & k = 1;
& && && && && &
& && && && &case 1:
& && && && && & DisplayData += UCA0RXBUF;
& && && && && & DisplayData &&= 8;
& && && && && & k = 2;
& && && && && &
& && && && &case 2:
& && && && && & DisplayData += UCA0RXBUF;
& && && && && & DisplayData &&= 8;
& && && && && & k = 3;
& && && && && &
& && && && &case 3:
& && && && && & DisplayData += UCA0RXBUF;
& && && && && & k = 0;
& && && && && & switch(ReadDataClassFlag)
& && && && && & {
& && && && && & ///////////////////////////////////接收数据,以下是接收数据的控制字
& && && && && & case 0xaf:DisplayData1 = *((float *)&DisplayData);
& && && && && & case 0xbe:DisplayData2 = *((float *)&DisplayData);
& && && && && & case 0xcc:DisplayData3 = *((float *)&DisplayData);
& && && && && & case 0xdb:DisplayData4 = *((float *)&DisplayData);
& && && && && & default:;
& && && && && & }
& && && && && & FrameHeaderFlag = 1;//帧数据接收完毕,32个bit数据为一帧
& && && && && &
& && && && &default:;
& && && && &}
& && && && &
& && &&&case 0xfa://停止发送的密码
& && && && &IdentifyHeader();
& && && && &
& && &&&default:;
我这个函数是MSP430G2553单片机的接受中断函数,单片机串口接收到数据后进入中断,首先判断是不是协议的帧头(我这里自行定义了一个协议)如果不是帧头,则是数据,进入数据的判断,由于PC机发送的是32位的数据,而UART只支持接收8位的数据,故此用了四个case语句判断。接收完32位的数据以后,问题又来了,我们用来存储接收来的数据是long类型(volatile long DisplayD)的。而我们需要接收的数据是float数据类型的。故此还需要一个转换。其实这个转换很简单。一个语句就可以了。
DisplayData1 = *((float *)&DisplayData);
首先将DisplayData的地址强制转换为float数据类型的地址,然后再对地址取值就可以了。至此,就可以完整地将long数据类型转换为float数据类型。
& && && &那么一整个过程就可以完整地实现,从PC机发送1、0代码到MSP430单片机接收为long数据类型,再由long数据类型强制转换为float数据类型。
& && && &那么同样道理,我们可以用同样的方法将long long数据类型转换为double数据类型。
PS :maswell我建了个全国大学生电子设计竞赛的交流群,群号,1000人群,还没满,大家可以加进去一起交流哦。
这个文档我做成了PDF,PDF下载见附件哦~
maswell xiao
于桂林电子科技大学信息与通信学院
科技协会科技楼实验室
桂电二院科协出品
本文版权所有,转载不究
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
lz你好&&,你的程序我有一个点不明白。我们每次接受一个float数据,只需把这个数据从long转换成float就行了,为什么这里要分四种情况& && && &
& && && && && & case 0xafisplayData1 = *((float *)&DisplayData);
& && && && && & case 0xbeisplayData2 = *((float *)&DisplayData);
& && && && && & case 0xccisplayData3 = *((float *)&DisplayData);
& && && && && & case 0xdbisplayData4 = *((float *)&DisplayData);
& && && && && &希望楼主解释一下
扫描二维码,随时随地手机跟帖
技术新星奖章
人才类勋章
您需要登录后才可以回帖
热门推荐 /4网站已改版,请使用新地址访问:
serial stc12c5a60s2串口通信发送和接收字节,字符串,整数,浮点 以及自动判别类 数 SCM 单片机开发 238万源代码下载- www.pudn.com
&文件名称: serial
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 3 KB
&&上传时间:
&&下载次数: 13
&&提 供 者:
&详细说明:stc12c5a60s2串口通信发送和接收字节,字符串,整数,浮点数,以及自动判别类型发送数据。方便调试用。原创。-stc12c5a60s2 serial communication to send and receive byte, string, integer, floating point, and automatically determine the type of send data. Facilitate debugging. Original.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&serial.c&&serial.h
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - STC12C5A60S2串口测试程序,包括串口数据传输,波特率设置等功能。
&[] - STC12C5A60S2双串口,串口一接收,串口二发射
&[] - STC12C5A60S2单片机驱动ds1302时钟芯片,读取和写入年月日时分秒的数据。
&[] - 基于单片机STC12C5A60S2和温度传感器DS18B20的测试程序,内含两个程序,分别是单片机程序及VB6上位机程序,通过串口进行通讯
&[] - 基于STC12C5A60S2,集成1381,时间显示,温度传感及按键的DIY板子程序。
&[] - STC12C5A60S2 串口模块程序,可选择校验位,或不选,我已测试通过。直接可以用
&[] - VB串口调试程序,数据个数转换,浮点数转换及应用
&[] - VxWorks 6.6 BSP开发执导
This document describes, in general terms, the elements that make up a board
support package [BSP], the requirements for a VxWo
&[] - 单片机串行输入计算的实现、单片机中的浮点数转换成串口格式输出
&[] - 由于浮点数在单片机上面占用很大的空间
本程序就是为了简化程序,希望对大家有用freescale单片机与PC串口通信发送单精度浮点小数打包与解包_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
freescale单片机与PC串口通信发送单精度浮点小数打包与解包
&&mc9s12xmal单片机与PC串口通信,有关单精度浮点小数到四字节数组的转换,数据的打包与解包等内容,是自己做的东西的总结,希望对读到的人有些许帮助。
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢有关单片机串口的使用,能否同时收发数据?-电子产品世界论坛
有关单片机串口的使用,能否同时收发数据?
关于单片机串口,能否同时实现数据的双向传输?如果不能,请问我怎样实现先收一组数据,然后再发送一组数据出去。最好能附上简单例程。谢谢指导
单片机的串口是 通用异步接收/发送装置,发送与接收不能同时进行,至于程序,你用的是什么单片机,是51吗?
单片机串口收/发数据会产生中断,在接收中断处理后再行发送数据即可,例程随便都能找到的。
是51单片机
我现在遇到的情况是,中断一直在进行。能不能帮忙找个例程呢?谢谢了!
中断一直进行?
是在不停的接收,来不及处理,还是没有清除标志等,需要具体细说了!
是一直不停的将从传感器采集到的数据从串口发送出去,怎么都停不下来,ES也置0了,急的我连break都试了,都不行。不知道问题出现在哪儿
相关代码能贴出来吗?
已经解决了,谢谢你的关注哈~
看你单片机功能了,串口通讯分为三种:单工,半双工,全双工。
要是你的单片机串口支持全双工,就可以实现收发同时进行了!!
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有}

我要回帖

更多关于 整型除以浮点型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信