久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4203|回復: 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;       
}

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

使用道具 舉報

沙發
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,數據 ...

只接收一個數據好辦,關鍵是循環多次接收數據怎么搞,假如我在每個數據后面加一個逗號作為結束標志符,那么我接收的時候怎么把這個標志符去掉呢?
回復

使用道具 舉報

5#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 538在线精品 | 免费美女网站 | 一级爱爱片 | 午夜爱爱网 | 91精品国产91久久综合桃花 | 国产一区二区三区在线 | 99视频精品 | 亚洲精品在线免费 | 亚洲一区二区三区 | 欧美色图综合网 | 成人免费大片黄在线播放 | 欧美精品在线一区二区三区 | 99久久婷婷国产综合精品电影 | 精品99在线 | 亚洲综合日韩精品欧美综合区 | 中文字幕一区二区三区不卡在线 | 日韩中文字幕av | 国产黄色在线观看 | 天天操天天干天天爽 | 欧美日韩中文在线 | 欧美日韩成人 | 久久这里只有 | av资源中文在线 | 涩爱av一区二区三区 | 久久6| 四虎影 | 国产乱码精品一区二区三区忘忧草 | 久久一二 | 亚洲精品视频在线 | 国产高清免费视频 | 中文字幕国产精品 | 国产www成人 | 亚洲国产免费 | 国产一级淫片a直接免费看 免费a网站 | 久久久国产一区二区三区 | 操久久| h在线播放| 欧美a在线看 | 韩国欧洲一级毛片 | 成人精品一区二区 | 91嫩草精品 |