找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)串口解析如何改進(jìn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本人在準(zhǔn)備藍(lán)橋杯單片機(jī)國賽,目前在學(xué)習(xí)串口的內(nèi)容,自己寫了代碼,pc通過串口給單片機(jī)開發(fā)板發(fā)送信息,單片機(jī)接收到后根據(jù)信息做出反應(yīng)。我在單片機(jī)解析串口信息這方面有些生疏,想問下各位大佬有什么好的建議或者需要優(yōu)化的地方。感謝各位。以下是我根據(jù)14屆單片機(jī)國賽題目,將按鍵控制改成了通過串口控制,以下是題目,關(guān)鍵代碼和工程文件,希望各位大佬能不吝賜教。 14屆國賽_串口.7z (45.83 KB, 下載次數(shù): 0)

  1. void Uart_Proc(void)
  2. {  
  3.     if(Uart_Recv_Index==0)return;
  4.     if(Uart_Recv_Tick>=10)
  5.     {
  6.         Uart_Recv_Tick=0;
  7.         Uart_Rx_Flag=0;

  8.         if(strcmp(Uart_Recv,"RESET")==0)
  9.         {
  10.             Seg_Mode=0;
  11.             canshu_Distance=40;
  12.             canshu_Temperature=30;
  13.             Factory_JiaoZhun=0;
  14.             Factory_Speed=340;
  15.             Factory_DAC_Limit_10x=10;
  16.             memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  17.             Uart_Recv_Index = 0;
  18.             return;
  19.         }

  20.         if(strcmp(Uart_Recv,"DM")==0)
  21.         {
  22.             Seg_Mode=0;
  23.             memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  24.             Uart_Recv_Index = 0;
  25.             return;
  26.         }else if(strcmp(Uart_Recv,"PM")==0)
  27.         {
  28.             Seg_Mode=1;
  29.             Parameter_Set_Mode=0;
  30.             printf("Please enter the parameters you want to set\r\n");
  31.             printf("SD:Set distance\r\nST:Set temperature\r\n");
  32.             memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  33.             Uart_Recv_Index = 0;
  34.             return;
  35.         }else if(strcmp(Uart_Recv,"FM")==0)
  36.         {
  37.             Seg_Mode=2;
  38.             printf("Please enter the parameters you want to set\r\n");
  39.             printf("SC:Set calibration \r\nSS:Set Speed\r\nSDAC:Set DAC Limit\r\n");
  40.             memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  41.             Uart_Recv_Index = 0;
  42.             return;
  43.         }

  44.         if (Seg_Mode==1)
  45.         {
  46.             if(strcmp(Uart_Recv,"SD")==0)
  47.             {
  48.                 Parameter_Set_Mode=0;
  49.                 Start_Set_Parameter=1;
  50.                 printf("Please Enter The Distance Parameter(10 to 90)\r\n");
  51.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  52.                 Uart_Recv_Index = 0;
  53.                 return;
  54.             }else if(strcmp(Uart_Recv,"ST")==0){
  55.                 Parameter_Set_Mode=1;
  56.                 Start_Set_Parameter=1;
  57.                 printf("Please Enter The Temperature Parameter(0 to 80)\r\n");
  58.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  59.                 Uart_Recv_Index = 0;
  60.                 return;
  61.             }

  62.             if (Start_Set_Parameter)
  63.             {
  64.                 unsigned char temp=0;
  65.                 unsigned char i=0;
  66.                 Start_Set_Parameter=0;
  67.                
  68.                 while(isdigit(Uart_Recv[i]))
  69.                 {
  70.                     temp=(temp*10+(Uart_Recv[i]-'0'));
  71.                     printf("Uart_Recv[%bd] is %c\r\n",i,Uart_Recv[i]);
  72.                     i++;
  73.                 }
  74.                 printf("temp is %bd\r\n",temp);
  75.                 if (Parameter_Set_Mode)
  76.                 {
  77.                     if(temp>=0&&temp<=80)
  78.                     {
  79.                         canshu_Temperature=temp;
  80.                     }else{
  81.                         printf("The Temperature Parameter must be 0 to 80!\r\n");
  82.                     }
  83.                 }else{
  84.                     if(temp>=10&&temp<=90)
  85.                     {
  86.                         canshu_Distance=temp;
  87.                     }else{
  88.                         printf("The Distance Parameter must be 10 to 90!\r\n");
  89.                     }
  90.                 }
  91.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  92.                 Uart_Recv_Index = 0;
  93.                 return;
  94.             }
  95.         }
  96.         
  97.         if (Seg_Mode==2)
  98.         {
  99.             if(strcmp(Uart_Recv,"SC")==0)
  100.             {
  101.                 Factory_Set_Mode=0;
  102.                 Start_Set_Factory_Parameter=1;
  103.                 printf("Please Enter The calibration value(-90 to 90)\r\n");
  104.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  105.                 Uart_Recv_Index = 0;
  106.                 return;
  107.             }else if(strcmp(Uart_Recv,"SS")==0){
  108.                 Factory_Set_Mode=1;
  109.                 Start_Set_Factory_Parameter=1;
  110.                 printf("Please Enter The Speed value(10 to 9990)\r\n");
  111.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  112.                 Uart_Recv_Index = 0;
  113.                 return;
  114.             }else if(strcmp(Uart_Recv,"SDAC")==0){
  115.                 Factory_Set_Mode=2;
  116.                 Start_Set_Factory_Parameter=1;
  117.                 printf("Please Enter The DAC value(0.1 to 2.0)\r\n");
  118.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  119.                 Uart_Recv_Index = 0;
  120.                 return;
  121.             }

  122.             if(Start_Set_Factory_Parameter)
  123.             {
  124.                 unsigned char i=0;
  125.                 unsigned int temp1=0;
  126.                 Start_Set_Factory_Parameter=0;
  127.                 ucLed[0]=1;

  128.                 switch(Factory_Set_Mode)
  129.                 {
  130.                     case 0:
  131.                         if (Uart_Recv[0]=='-')
  132.                         {
  133.                            
  134.                             signed char temp=0;ucLed[2]^=1;i=1;
  135.                             while (isdigit(Uart_Recv[i]))
  136.                             {
  137.                                 temp=(temp*10+(Uart_Recv[i]-'0'));
  138.                                 // printf("Uart_Recv[%bd] is %c\r\n",i,Uart_Recv[i]);
  139.                                 i++;
  140.                             }
  141.                             // printf("temp is %bd\r\n",temp);
  142.                             if(temp>90)
  143.                             {
  144.                                 printf("The calibration value must be -90 to 90!\r\n");
  145.                             }else{
  146.                                 Factory_JiaoZhun=-temp;
  147.                                 // printf("Factory_JiaoZhun is %bd\r\n",Factory_JiaoZhun);
  148.                             }
  149.                         }else{
  150.                             unsigned char temp=0;
  151.                             while (isdigit(Uart_Recv[i]))
  152.                             {
  153.                                 temp=(temp*10+(Uart_Recv[i]-'0'));
  154.                                 i++;
  155.                             }
  156.                             if(temp>90)
  157.                             {
  158.                                 printf("The calibration value must be -90 to 90!\r\n");
  159.                             }else{
  160.                                 Factory_JiaoZhun=temp;
  161.                             }
  162.                         }
  163.                     break;

  164.                     case 1:
  165.                         while (isdigit(Uart_Recv[i]))
  166.                         {
  167.                             temp1=(temp1*10+(Uart_Recv[i]-'0'));
  168.                             i++;
  169.                         }
  170.                         if(temp1<10||temp1>9990)
  171.                         {
  172.                             printf("The Speed value must be 10 to 9990!\r\n");
  173.                         }else{
  174.                             Factory_Speed=temp1;
  175.                         }
  176.                         
  177.                     break;
  178.                     
  179.                     case 2:
  180.                         while (i<Uart_Recv_Index)
  181.                         {
  182.                             if (isdigit(Uart_Recv[i]))
  183.                             {
  184.                                 temp1=(temp1*10+(Uart_Recv[i]-'0'));
  185.                             }
  186.                             i++;
  187.                         }
  188.                         if(temp1<1||temp1>20)
  189.                         {
  190.                             printf("The DAC value must be 0.1 to 2.0!\r\n");
  191.                         }else{
  192.                             Factory_DAC_Limit_10x=temp1;
  193.                         }
  194.                         
  195.                     break;
  196.                 }
  197.             
  198.                 memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  199.                 Uart_Recv_Index = 0;
  200.                 return;
  201.             }
  202.             
  203.         }
  204.         
  205.         memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
  206.         Uart_Recv_Index = 0;
  207.     }
  208. }
復(fù)制代碼

  1. void Uart1Server() interrupt 4
  2. {
  3.     if(RI == 1) //串口接收數(shù)據(jù)
  4.     {

  5.         RI = 0;
  6.         Uart_Rx_Flag = 1; // 標(biāo)記有完整命令
  7.         Uart_Recv_Tick = 0;

  8.         Uart_Recv[Uart_Recv_Index] = SBUF;
  9.         Uart_Recv_Index++;

  10.         if(Uart_Recv_Index>10)
  11.         {
  12.             Uart_Recv_Index = 0;
  13.             memset(Uart_Recv,0,10);
  14.         }
  15.     }
  16. }
復(fù)制代碼







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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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