找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3775|回复: 4
收起左侧

请问单片机怎么接收从串口发送过来的浮点数?

[复制链接]
ID:240534 发表于 2017-10-31 15:56 | 显示全部楼层 |阅读模式
     如题,单片机接收串口发送的浮点数,然后进行处理,我想的是建立一个二维数组,想把浮点数一位一位的存到数组里,因为要接收多个浮点数所以用了二维数组,可是实际发现是不可行的,请问到底应该怎么接收啊。以下是我写的串口数据接收代码,还请各位大神指点一下,我实在是不知道该怎么办了。
void init()//串口初始化
{
        SCON=0x50;        //串口:方式1,允许发送和接收
        TMOD=0x20;        //定时器1:模式2,8位自动重装模式,用于产生波特率  
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SM0=0;            //串口工作方式1
        SM1=1;            //串口工作方式1
        REN=1;            //允许串行口接收数据
        EA=1;             //开总中断
        ES=1;                    //打开串口中断
}

int strTransform(char *p)   //字符处理函数
{
         float f = atof(p);      //将字符转换成浮点数
         int n = (int)(f * 100 + 0.5);  //四舍五入
         //    char *q = new char[strlen(p)];
         //    strcpy(q, p);
         //    q [6] = '\0';
   //    printf("%s\n", q);
        return n;
}
void main()
{       
        init();
        while(1)
        {        
           if(flag==1)
                {
                        ES=0; //关闭串口中断
              GSM_Sent_Text_Message();
                        ES=1;
                        flag=0;//如果发送完数据之后flag不置0,则会一直处于发送状态,模块将不停地发短信
                        Delay_ms(300);
                        //printf("sent message");
                }                       
        }
}

void ser() interrupt 4  //串口中断服务程序
{   
            RI=0;//接收中断标志位,停止接收
          for(row=0;row<8;row++)
        {  
                for(column=0;column<9;column++)
                {
                   strRcv[row][column]=SBUF;      //将接收缓存里面的数据存放到数组
                }
                   switch(row)
                         {  
                                 case 0:
                                    sprintf(string0,"%9s",strRcv[row]);//将接收的每个数据提取出来,以便后面对数据进行处理
                                   //char *a1=(char*)malloc(5);
                                    // n=strTransform(string0);
                                     sprintf(a0,"%04d",strTransform(string0));
                                     break;
                                 case 1:
                                     sprintf(string1,"%9s",strRcv[row]);
                                     sprintf(a1,"%04d",strTransform(string1));
                                     break;
                                 case 2:
                                     sprintf(string2,"%9s",strRcv[row]);
                                     sprintf(a2,"%04d",strTransform(string2));
                                     break;
                                 case 3:
                                     sprintf(string3,"%9s",strRcv[row]);
                                     sprintf(a3,"%04d",strTransform(string3));
                                     break;
                                 case 4:
                                     sprintf(string4,"%9s",strRcv[row]);
                                     sprintf(a4,"%04d",strTransform(string4));
                                     break;
                                 case 5:
                                     sprintf(string5,"%9s",strRcv[row]);
                                     sprintf(a5,"%04d",strTransform(string5));
                                     break;
                                 case 6:
                                     sprintf(string6,"%9s",strRcv[row]);
                                     sprintf(a6,"%04d",strTransform(string6));
                                     break;
                                 case 7:
                                     sprintf(string7,"%9s",strRcv[row]);
                                     sprintf(a7,"%04d",strTransform(string7));
                                     break;
                         }
        }
              strdata=strcat(strdata,a0);
              strdata=strcat(strdata,a1);
              strdata=strcat(strdata,a2);
        strdata=strcat(strdata,a3);
              strdata=strcat(strdata,a4);
              strdata=strcat(strdata,a6);
              strdata=strcat(strdata,a7);
          flag=1;//产生中断标志
    //RI=1;       
}

回复

使用道具 举报

ID:123289 发表于 2017-10-31 23:45 | 显示全部楼层
关键是你要知道浮点数是如何保存的(存在哪里?几个字节)。
一般的浮点数有四个字节。
串行口是一个一个字节接收的,收到后组装一下(放到对应的地方),放入变量中。
回复

使用道具 举报

ID:213173 发表于 2017-11-1 08:27 | 显示全部楼层
串口每次只能接收一个字节。可以添加一个数据头和数据尾用于验证,共6个字节。例如:AA xx xx xx xx 55,数据头在串口中断里判断,有效字节和数据尾放在主循环里处理。

void ser() interrupt 4
{
        static unsigned char num=0;                //静态变量
        RI=0;                                                        //接收中断请求标志位清0
        strRcv[num]=SBUF;                                //保存SBUF接收到的数据
        if(strRcv[0]==0xAA)                                //验证数据头
        {
                num++;
                if(num>=6)
                {
                        flag=1;                                        //接收完成标志置1
                        num=0;
                }
        }
}
回复

使用道具 举报

ID:240534 发表于 2017-11-1 20:07 | 显示全部楼层
wulin 发表于 2017-11-1 08:27
串口每次只能接收一个字节。可以添加一个数据头和数据尾用于验证,共6个字节。例如:AA xx xx xx xx 55,数据 ...

只接收一个数据好办,关键是循环多次接收数据怎么搞,假如我在每个数据后面加一个逗号作为结束标志符,那么我接收的时候怎么把这个标志符去掉呢?
回复

使用道具 举报

ID:213173 发表于 2017-11-2 08:34 | 显示全部楼层
章鱼 发表于 2017-11-1 20:07
只接收一个数据好办,关键是循环多次接收数据怎么搞,假如我在每个数据后面加一个逗号作为结束标志符,那 ...

1.串口传输数据一般是HEX模式(16进制),也可以文本模式。逗号是文本,用逗号作为结束标志这样混用会增加编程难度。
2.你想在串口中断里用for循环来接收数据串是做不到的,因为每次中断只能收到一个字节,必需多次中断接收并保存,数据串接收完成后再在主程序里解析处理。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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