X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
单片机
[讨论] 假如串口通信上要用上浮点数,你是怎么处理的?
ywlzh
2017-3-24 10:30
楼主
突然的头脑发热,闷声想出来的一个想法。而正是这种想法驱使着我一定要拿一个实验测试一下,平台肯定要在硬件上,如果用计算机直接去做,那就太没意思了。
虽说现在大部分的项目中,尤其是在串口通信上,协议里大多数的情况下都不会去发送float,或者double数据,都是命令式的,带的数据都是整形的变量,假如要发送浮点数,怎么办?
用ASCII码形式发送接收,哎呀,一下就想到问题的解决办法,的确,这个就能搞定,但这样,就得让整个通信协议都得做ASCII码,人嘛,总是会跟自己较真,要是用16进制呢? 于是,开始复习计算机理论基础,里面有提到过float,double型数据在内存是如何存储的,什么阶码,尾数,这里不做过多赘述。
两个方法:用union 关键字,或者直接用unsigned char型指针。
先看程序吧
union Shared_float //创造共用体
{
float f;
unsigned char data[4];
};
union Shared_double
{
double d;
unsigned char data[8];
};
void TestTask(void *p_arg)
{
OS_ERR err;
union Shared_float numj;
union Shared_double numd;
u8 *p;
float te_fl;
double te_dou;
numj.f = 5.3f;
for(;;)
{
if(USART_RX_STA&0x8000){ //串口接收到数据
USART_RX_STA = 0;
if(USART_RX_BUF[0] ==0x01){ //用共用体来存储float型数据
int i=0;
for(;i<4;i++){
numj.data[3-i] = USART_RX_BUF[i+1];
}
}
else if(USART_RX_BUF[0] ==0x02){ //用共用体来存储double型数据
int i=0;
for(;i<8;i++){
numd.data[7-i] = USART_RX_BUF[i+1];
}
}
else if(USART_RX_BUF[0] ==0x03){ //用指针来存储float型数据
int i=4;
p = (unsigned char *) &te_fl;
for(;i>0;i--){
*p = USART_RX_BUF[i];
p++;
}
}
else if(USART_RX_BUF[0] ==0x04){ ////用指针来存储double型数据
int i=8;
p = (unsigned char *) &te_dou;
for(;i>0;i--){
*p = USART_RX_BUF[i];
p++;
}
}
}
OSTimeDlyHMSM(0,0,0,40,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
简单说下吧,硬件平台是stm32F1,软件框架是在ucosIII上添加了一个任务,串口采用的硬件中断接收,再加空闲中断,这样能处理不定长的数据,本来是想采用信号量的,省得麻烦,用
USART_RX_STA
这个变量的最高位来判断串口接收完数据没,数组
USART_RX_BUF
用来缓存串口接收的数据,第一个字节来判断是用共用体还是用指针
0x01 就是用float的共用体
0x02 就是用double的共用体
0x03 就是用指针强制操作float数据
0x04 就是用指针强制操作double数据
程序运行,是看不到结果的,在硬件仿真下才看的到结果,用串口调试助手和MDK的硬仿平台
改变第一个字节的数据就OK.
结果出来了,回到标题,你是怎么处理的呢?有没有更灵活的方式?
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞
回复评论 (4)
沙发
汤权
不用麻烦,单精度浮点数占用4个字节,直接传输这4个字节到上位机,上位机不做处理直接还原原数值
如果嫌4个字节太多就用两个字节传输,浮点数乘以10或者100转成整形数,上位机端除以10或者100得到原来的浮点数。
本帖最后由 汤权 于 2017-3-24 10:58 编辑
亚里士缺德
点赞
2017-3-24 10:57
板凳
ywlzh
引用:
汤权 发表于 2017-3-24 10:57
不用麻烦,单精度浮点数占用4个字节,直接传输这4个字节到上位机,上位机不做处理直接还原原数值
如果 ...
你想说出的是移位?
假如定义了一个float型数据 num_f
上位机接收的四个字节,在num_f里直接移位获取四个字节
等效之下,这的确也适应MCU,的确是个好办法
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞
2017-3-24 11:06
4楼
chunyang
串口通讯跟数据的数制无关,至于怎么表示浮点数,用常规表示法或者你自己定义的方法都可以。而常规表示法之所以是“常规”,自然有其方便之处。关于这一点,计算机原理和编程语言的教材都有详细讲解。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞
2017-3-24 15:18
5楼
人民币的幻想
传float或者double的每个字节,接收方依次接收,然后按顺序解析。
作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
点赞
2017-3-24 15:24
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
GPS天线和GSM天线的区别?
跨越算法与实现的鸿沟 ——如何用数字IC/FPGA实现算法
菜鸟请教高手问题
【TI荐课】#什么是 I2C 设计工具?#
TI杯电赛论文精选
招熟悉win ce的软件开发人员
关于串口通讯ReadLine的问题
改激光雕刻机求助
msp430f5529 如何从mpu6050中获得数据,I2c 如何定义
【先楫HPM6750测评】测试CAN收发
MSP430F5529时钟以及FLL配置
请问怎么从单片机里面读出片内程序?我要仿制一个基于单片机的飞行高度显示仪,不知道怎么克隆做出另外一个同样功能的单片机。请教大侠
st72f324定时器问题
难道是官方库出错了吗?
主题:2006年十大笑话排行
PRETEL99SE汉化的,铺地有点问题
让人崩溃的问题
USB程序和制作全套资料
【麦昆试用】迟来的第二帖——调通小车上的基础输入\输出外设
感恩有你+所有帮助我的人和物
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复