找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4322|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

請問單片機怎么接收從串口發(fā)送過來的浮點數(shù)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:240534 發(fā)表于 2017-10-31 15:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
     如題,單片機接收串口發(fā)送的浮點數(shù),然后進行處理,我想的是建立一個二維數(shù)組,想把浮點數(shù)一位一位的存到數(shù)組里,因為要接收多個浮點數(shù)所以用了二維數(shù)組,可是實際發(fā)現(xiàn)是不可行的,請問到底應(yīng)該怎么接收啊。以下是我寫的串口數(shù)據(jù)接收代碼,還請各位大神指點一下,我實在是不知道該怎么辦了。
void init()//串口初始化
{
        SCON=0x50;        //串口:方式1,允許發(fā)送和接收
        TMOD=0x20;        //定時器1:模式2,8位自動重裝模式,用于產(chǎn)生波特率  
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SM0=0;            //串口工作方式1
        SM1=1;            //串口工作方式1
        REN=1;            //允許串行口接收數(shù)據(jù)
        EA=1;             //開總中斷
        ES=1;                    //打開串口中斷
}

int strTransform(char *p)   //字符處理函數(shù)
{
         float f = atof(p);      //將字符轉(zhuǎn)換成浮點數(shù)
         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; //關(guān)閉串口中斷
              GSM_Sent_Text_Message();
                        ES=1;
                        flag=0;//如果發(fā)送完數(shù)據(jù)之后flag不置0,則會一直處于發(fā)送狀態(tài),模塊將不停地發(fā)短信
                        Delay_ms(300);
                        //printf("sent message");
                }                       
        }
}

void ser() interrupt 4  //串口中斷服務(wù)程序
{   
            RI=0;//接收中斷標(biāo)志位,停止接收
          for(row=0;row<8;row++)
        {  
                for(column=0;column<9;column++)
                {
                   strRcv[row][column]=SBUF;      //將接收緩存里面的數(shù)據(jù)存放到數(shù)組
                }
                   switch(row)
                         {  
                                 case 0:
                                    sprintf(string0,"%9s",strRcv[row]);//將接收的每個數(shù)據(jù)提取出來,以便后面對數(shù)據(jù)進行處理
                                   //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;//產(chǎn)生中斷標(biāo)志
    //RI=1;       
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2017-10-31 23:45 | 只看該作者
關(guān)鍵是你要知道浮點數(shù)是如何保存的(存在哪里?幾個字節(jié))。
一般的浮點數(shù)有四個字節(jié)。
串行口是一個一個字節(jié)接收的,收到后組裝一下(放到對應(yīng)的地方),放入變量中。
回復(fù)

使用道具 舉報

板凳
ID:213173 發(fā)表于 2017-11-1 08:27 | 只看該作者
串口每次只能接收一個字節(jié)?梢蕴砑右粋數(shù)據(jù)頭和數(shù)據(jù)尾用于驗證,共6個字節(jié)。例如:AA xx xx xx xx 55,數(shù)據(jù)頭在串口中斷里判斷,有效字節(jié)和數(shù)據(jù)尾放在主循環(huán)里處理。

void ser() interrupt 4
{
        static unsigned char num=0;                //靜態(tài)變量
        RI=0;                                                        //接收中斷請求標(biāo)志位清0
        strRcv[num]=SBUF;                                //保存SBUF接收到的數(shù)據(jù)
        if(strRcv[0]==0xAA)                                //驗證數(shù)據(jù)頭
        {
                num++;
                if(num>=6)
                {
                        flag=1;                                        //接收完成標(biāo)志置1
                        num=0;
                }
        }
}
回復(fù)

使用道具 舉報

地板
ID:240534 發(fā)表于 2017-11-1 20:07 | 只看該作者
wulin 發(fā)表于 2017-11-1 08:27
串口每次只能接收一個字節(jié)?梢蕴砑右粋數(shù)據(jù)頭和數(shù)據(jù)尾用于驗證,共6個字節(jié)。例如:AA xx xx xx xx 55,數(shù)據(jù) ...

只接收一個數(shù)據(jù)好辦,關(guān)鍵是循環(huán)多次接收數(shù)據(jù)怎么搞,假如我在每個數(shù)據(jù)后面加一個逗號作為結(jié)束標(biāo)志符,那么我接收的時候怎么把這個標(biāo)志符去掉呢?
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2017-11-2 08:34 | 只看該作者
章魚 發(fā)表于 2017-11-1 20:07
只接收一個數(shù)據(jù)好辦,關(guān)鍵是循環(huán)多次接收數(shù)據(jù)怎么搞,假如我在每個數(shù)據(jù)后面加一個逗號作為結(jié)束標(biāo)志符,那 ...

1.串口傳輸數(shù)據(jù)一般是HEX模式(16進制),也可以文本模式。逗號是文本,用逗號作為結(jié)束標(biāo)志這樣混用會增加編程難度。
2.你想在串口中斷里用for循環(huán)來接收數(shù)據(jù)串是做不到的,因為每次中斷只能收到一個字節(jié),必需多次中斷接收并保存,數(shù)據(jù)串接收完成后再在主程序里解析處理。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表