OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 4177|回复: 20

通过串口调试助手发送float型数据,然后让其在液晶显示屏上显示,下位机应该怎样处理接收到的数据,再转化为float型数据

[复制链接]

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
发表于 2015-10-26 17:03:45 | 显示全部楼层 |阅读模式
5金钱
通过串口调试助手发送float型数据,然后让其在液晶显示屏上显示,下位机应该怎样处理接收到的数据,再转化为float型数据

最佳答案

查看完整内容[请看2#楼]

首先搞清楚,给单片机发float和在液晶屏上显示是两件不同的事。如果是定点的数据,很简单了,发的时候你可以按整数发,比如1.91,扩大100倍,发送;如果是浮点型,麻烦一点,首先你要明白float在内存中的表示方法,一般占用四个字节,然后写个联合体,注意大端小端!float数据,你一个字节一个字节发送,接收端按顺序放到联合体中,字节读取float型数据,就是你下发的!液晶显示我就不说了!
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-10-26 17:03:46 | 显示全部楼层
首先搞清楚,给单片机发float和在液晶屏上显示是两件不同的事。如果是定点的数据,很简单了,发的时候你可以按整数发,比如1.91,扩大100倍,发送;如果是浮点型,麻烦一点,首先你要明白float在内存中的表示方法,一般占用四个字节,然后写个联合体,注意大端小端!float数据,你一个字节一个字节发送,接收端按顺序放到联合体中,字节读取float型数据,就是你下发的!液晶显示我就不说了!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-10-26 22:32:49 | 显示全部楼层
新人求指教???
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 12:05:29 | 显示全部楼层
回复【3楼】无痕幽雨:
---------------------------------
大哥,还是不行啊,我现在主要弄不清楚的是我在串口助手发送一个float型数据,单片机是发送了一次中断还是说发生了四次,如果是一次的话,我连续用四个a【i++】=sbuf来获取值也不对啊,如果是四次中断的话读出来的也不对,真的是把我弄糊涂了
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 12:06:40 | 显示全部楼层
回复【3楼】无痕幽雨:
---------------------------------
你说的用联合体我也试验了,不行
回复

使用道具 举报

  离线 

5

主题

164

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2011-11-7
在线时间
179 小时
发表于 2015-11-5 12:29:04 | 显示全部楼层
用串口助手,发送字符串格式,单片机收到后直接去做显示就行了
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 13:15:19 | 显示全部楼层
回复【6楼】夜猫煮茶:
---------------------------------
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
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-11-5 13:24:42 | 显示全部楼层
回复【7楼】djgwerrfccd:
---------------------------------
哎,联合体都不会用!好好看看C吧!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 13:29:27 | 显示全部楼层
回复【8楼】无痕幽雨:
---------------------------------
请问哪错了,还请指教
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-11-5 13:35:17 | 显示全部楼层
回复【9楼】djgwerrfccd:
---------------------------------
现在的新人都不会用百度了??
struct Uint8_char4
{
unsigned char byte0;
unsigned char byte1;
unsigned char byte2;
unsigned char byte3;

};

union Commonwealth_flaot
{
struct Uint8_char4 Data_Uint8_byte;//注意大端小端
float my_data;
};
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 13:40:20 | 显示全部楼层
回复【10楼】无痕幽雨:
---------------------------------
为什么char型要用结构体的形式啊?
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-11-5 14:11:42 | 显示全部楼层
回复【11楼】djgwerrfccd:
---------------------------------
哦,我错了!我想成位域了,不好意思。你那么用也对,我只是不习惯而已。上位机是不能直接发float的,伪代码如下:

上位机:

//定义变量
struct Uint8_char4 

unsigned char byte0; 
unsigned char byte1; 
unsigned char byte2; 
unsigned char byte3; 

}; 

union Commonwealth_flaot 

struct Uint8_char4 Data_Uint8_byte;//注意大端小端 
float         my_data; 
};


union Commonwealth_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;(分四次发送,每次发送一个字节,注意波特率,校验位,停止位)

下位机:

union Commonwealth_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型数据。
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 14:23:14 | 显示全部楼层
回复【12楼】无痕幽雨:
---------------------------------
你的意思是说我直接用串口助手发送float型数据是不行的,除非上位机是自己写的才行吗?
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-11-5 14:56:29 | 显示全部楼层
回复【13楼】djgwerrfccd:
---------------------------------
我在10楼说的很清楚了,你自己理解吧!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 15:20:18 | 显示全部楼层
我是实在没用过伪代码啊,除了在汇编看过外,所以实在不能理解你的意思
回复

使用道具 举报

  离线 

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-8-19
在线时间
3 小时
 楼主| 发表于 2015-11-5 15:20:34 | 显示全部楼层
回复【14楼】无痕幽雨:
---------------------------------
我是实在没用过伪代码啊,除了在汇编看过外,所以实在不能理解你的意思
回复

使用道具 举报

  离线 

5

主题

164

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2011-11-7
在线时间
179 小时
发表于 2015-11-5 21:11:17 | 显示全部楼层
回复【7楼】djgwerrfccd:
---------------------------------
还有一个问题,电脑对浮点数据的编码(编码的说法可能不准确)与你所使用的编译器(Keil C51?)可能是不一样的,所以,有可能你用结构体,怎么样都不行。其实可能变通一下,在电脑那边把小数变成整数后再发送就可以了,先约定好放大的位数,比如是1000倍,你要发送1.23,那就发送1230,到单片机这边,根据放大的倍数就可以确定小数点的位置了,这样也可以正确的显示小数了,还免去了单片机运算浮点数的开销,单片机搞浮点很慢的
回复

使用道具 举报

  离线 

10

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2015-5-14
在线时间
98 小时
发表于 2015-11-6 08:32:10 | 显示全部楼层
回复【17楼】夜猫煮茶:
---------------------------------
不要误导新手,float表示是一个标准,类似ASCII嘛,虽然有别的标准,但是我还没有遇到过。楼主问题不是这个原因!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

  离线 

2

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2013-6-5
在线时间
107 小时
发表于 2015-11-6 22:19:10 | 显示全部楼层
发字符串,然后用atof(),
头文件是stdlib.h
回复

使用道具 举报

  离线 

2

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2013-6-5
在线时间
107 小时
发表于 2015-11-6 22:21:29 | 显示全部楼层
为什么放着标准库函数不用,自己瞎搞?
回复

使用道具 举报

  离线 

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-3-8
在线时间
17 小时
发表于 2018-7-7 18:05:57 | 显示全部楼层
[AppleScript] 纯文本查看 复制代码
int main(void)
 {	
	u8 t;
	u8 len;	
	u16 times=0; 
 
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(9600);	 //串口初始化为9600
	LED_Init();		  	 //初始化与LED连接的硬件接口 
	 LCD_Init();
	 POINT_COLOR=RED;
	BACK_COLOR=WHITE;
	
	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n");
			for(t=0;t<len;t++)
			{
				
				USART1->DR=USART_RX_BUF[t];
				LCD_ShowxNum(60,170,USART_RX_BUF[t],3,16,0);
				LCD_ShowChar(60,150,USART_RX_BUF[t],3,0);
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\nALIENTEK MiniSTM32开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
			if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		}
		//LCD_ShowxNum(60,170,Res,2,16,0);
         //LCD_ShowChar(60,150,Res,2,0);
		 //LCD_ShowString(60,120,2,16,16,"Res");
	}	 
}




我这个在调试助手发送在LCD显示屏上显示ASCll码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-11-16 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */