OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10053|回复: 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型数据,就是你下发的!液晶显示我就不说了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 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

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 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

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 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

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 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

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 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

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 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

主题

163

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2018-3-8
在线时间
24 小时
发表于 2018-7-7 18:05:57 | 显示全部楼层
[mw_shl_code=applescript,true]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");
        }         
}[/mw_shl_code]



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

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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