完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
首先搞清楚,给单片机发float和在液晶屏上显示是两件不同的事。如果是定点的数据,很简单了,发的时候你可以按整数发,比如1.91,扩大100倍,发送;如果是浮点型,麻烦一点,首先你要明白float在内存中的表示方法,一般占用四个字节,然后写个联合体,注意大端小端!float数据,你一个字节一个字节发送,接收端按顺序放到联合体中,字节读取float型数据,就是你下发的!液晶显示我就不说了!
|
|
|
|
|
|
新人求指教???
|
|
|
|
|
|
大哥,还是不行啊,我现在主要弄不清楚的是我在串口助手发送一个float型数据,单片机是发送了一次中断还是说发生了四次,如果是一次的话,我连续用四个a【i++】=***uf来获取值也不对啊,如果是四次中断的话读出来的也不对,真的是把我弄糊涂了
|
|
|
|
|
|
你说的用联合体我也试验了,不行
|
|
|
|
|
|
用串口助手,发送字符串格式,单片机收到后直接去做显示就行了
|
|
|
|
|
|
void ser_int (void) interrupt 4
{ if(RI==1) { RI=0; a.table_float[j++]=SBUF; if(j%4==0) { j=0; //ES=0; count++; //chtofl(); } if(count==1) { glat=a.chartofloat; // ES=1; } else if(count==2) { longa=a.chartofloat; count=0; flag=1; // ES=1; } } } union perdata { float chartofloat;//定义一个联合体,存储float型数据 char table_float[4]; }a; 还是不行啊,接收到的都是0 |
|
|
|
|
|
哎,联合体都不会用!好好看看C吧!
|
|
|
|
|
|
请问哪错了,还请指教
|
|
|
|
|
|
现在的新人都不会用百度了??
structUint8_char4 { unsignedcharbyte0; unsignedcharbyte1; unsignedcharbyte2; unsignedcharbyte3; }; unionCommonwealth_flaot { structUint8_char4Data_Uint8_byte;//注意大端小端 floatmy_data; }; |
|
|
|
|
|
为什么char型要用结构体的形式啊?
|
|
|
|
|
|
哦,我错了!我想成位域了,不好意思。你那么用也对,我只是不习惯而已。上位机是不能直接发float的,伪代码如下:
上位机: //定义变量 structUint8_char4 { unsignedcharbyte0; unsignedcharbyte1; unsignedcharbyte2; unsignedcharbyte3; }; unionCommonwealth_flaot { structUint8_char4Data_Uint8_byte;//注意大端小端 float my_data; }; unionCommonwealth_flaot float_PC; float_PC.my_data=15.8776(你要发的数据); 然后分别发送:float_PC.Data_Uint8_byte.byte0,float_PC.Data_Uint8_byte.byte1,float_PC.Data_Uint8_byte.byte2,float_PC.Data_Uint8_byte.byte3;(分四次发送,每次发送一个字节,注意波特率,校验位,停止位) 下位机: unionCommonwealth_flaot float_MCU; 在串口里接收: 如果内存存储方式和PC机一致: float_MCU.byte0=SBUF; float_MCU.byte1=SBUF; float_MCU.byte2=SBUF; float_MCU.byte3=SBUF; 否则: float_MCU.byte3=SBUF; float_MCU.byte2=SBUF; float_MCU.byte1=SBUF; float_MCU.byte0=SBUF; 那么接收完四个字节后: float_MCU.my_data就是你PC机发的float型数据。 |
|
|
|
|
|
你的意思是说我直接用串口助手发送float型数据是不行的,除非上位机是自己写的才行吗?
|
|
|
|
|
|
我在10楼说的很清楚了,你自己理解吧!
|
|
|
|
|
|
我是实在没用过伪代码啊,除了在汇编看过外,所以实在不能理解你的意思
|
|
|
|
|
|
我是实在没用过伪代码啊,除了在汇编看过外,所以实在不能理解你的意思
|
|
|
|
|
|
还有一个问题,电脑对浮点数据的编码(编码的说法可能不准确)与你所使用的编译器(Keil C51?)可能是不一样的,所以,有可能你用结构体,怎么样都不行。其实可能变通一下,在电脑那边把小数变成整数后再发送就可以了,先约定好放大的位数,比如是1000倍,你要发送1.23,那就发送1230,到单片机这边,根据放大的倍数就可以确定小数点的位置了,这样也可以正确的显示小数了,还免去了单片机运算浮点数的开销,单片机搞浮点很慢的
|
|
|
|
|
|
不要误导新手,float表示是一个标准,类似ASCII嘛,虽然有别的标准,但是我还没有遇到过。楼主问题不是这个原因!
|
|
|
|
|
|
|
|
|
|
|
|
为什么放着标准库函数不用,自己瞎搞?
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4206浏览 3评论
2378浏览 0评论
3392浏览 0评论
1157浏览 0评论
2842浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 15:52 , Processed in 2.518464 second(s), Total 110, Slave 90 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1436