|
本人在準(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)鍵代碼和工程文件,希望各位大佬能不吝賜教。
第十四屆國賽.png (1.8 MB, 下載次數(shù): 0)
下載附件
2025-5-15 19:53 上傳
14屆國賽_串口.7z
(45.83 KB, 下載次數(shù): 0)
2025-5-15 19:53 上傳
點(diǎn)擊文件名下載附件
- void Uart_Proc(void)
- {
- if(Uart_Recv_Index==0)return;
- if(Uart_Recv_Tick>=10)
- {
- Uart_Recv_Tick=0;
- Uart_Rx_Flag=0;
- if(strcmp(Uart_Recv,"RESET")==0)
- {
- Seg_Mode=0;
- canshu_Distance=40;
- canshu_Temperature=30;
- Factory_JiaoZhun=0;
- Factory_Speed=340;
- Factory_DAC_Limit_10x=10;
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
- if(strcmp(Uart_Recv,"DM")==0)
- {
- Seg_Mode=0;
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }else if(strcmp(Uart_Recv,"PM")==0)
- {
- Seg_Mode=1;
- Parameter_Set_Mode=0;
- printf("Please enter the parameters you want to set\r\n");
- printf("SD:Set distance\r\nST:Set temperature\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }else if(strcmp(Uart_Recv,"FM")==0)
- {
- Seg_Mode=2;
- printf("Please enter the parameters you want to set\r\n");
- printf("SC:Set calibration \r\nSS:Set Speed\r\nSDAC:Set DAC Limit\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
- if (Seg_Mode==1)
- {
- if(strcmp(Uart_Recv,"SD")==0)
- {
- Parameter_Set_Mode=0;
- Start_Set_Parameter=1;
- printf("Please Enter The Distance Parameter(10 to 90)\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }else if(strcmp(Uart_Recv,"ST")==0){
- Parameter_Set_Mode=1;
- Start_Set_Parameter=1;
- printf("Please Enter The Temperature Parameter(0 to 80)\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
- if (Start_Set_Parameter)
- {
- unsigned char temp=0;
- unsigned char i=0;
- Start_Set_Parameter=0;
-
- while(isdigit(Uart_Recv[i]))
- {
- temp=(temp*10+(Uart_Recv[i]-'0'));
- printf("Uart_Recv[%bd] is %c\r\n",i,Uart_Recv[i]);
- i++;
- }
- printf("temp is %bd\r\n",temp);
- if (Parameter_Set_Mode)
- {
- if(temp>=0&&temp<=80)
- {
- canshu_Temperature=temp;
- }else{
- printf("The Temperature Parameter must be 0 to 80!\r\n");
- }
- }else{
- if(temp>=10&&temp<=90)
- {
- canshu_Distance=temp;
- }else{
- printf("The Distance Parameter must be 10 to 90!\r\n");
- }
- }
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
- }
-
- if (Seg_Mode==2)
- {
- if(strcmp(Uart_Recv,"SC")==0)
- {
- Factory_Set_Mode=0;
- Start_Set_Factory_Parameter=1;
- printf("Please Enter The calibration value(-90 to 90)\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }else if(strcmp(Uart_Recv,"SS")==0){
- Factory_Set_Mode=1;
- Start_Set_Factory_Parameter=1;
- printf("Please Enter The Speed value(10 to 9990)\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }else if(strcmp(Uart_Recv,"SDAC")==0){
- Factory_Set_Mode=2;
- Start_Set_Factory_Parameter=1;
- printf("Please Enter The DAC value(0.1 to 2.0)\r\n");
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
- if(Start_Set_Factory_Parameter)
- {
- unsigned char i=0;
- unsigned int temp1=0;
- Start_Set_Factory_Parameter=0;
- ucLed[0]=1;
- switch(Factory_Set_Mode)
- {
- case 0:
- if (Uart_Recv[0]=='-')
- {
-
- signed char temp=0;ucLed[2]^=1;i=1;
- while (isdigit(Uart_Recv[i]))
- {
- temp=(temp*10+(Uart_Recv[i]-'0'));
- // printf("Uart_Recv[%bd] is %c\r\n",i,Uart_Recv[i]);
- i++;
- }
- // printf("temp is %bd\r\n",temp);
- if(temp>90)
- {
- printf("The calibration value must be -90 to 90!\r\n");
- }else{
- Factory_JiaoZhun=-temp;
- // printf("Factory_JiaoZhun is %bd\r\n",Factory_JiaoZhun);
- }
- }else{
- unsigned char temp=0;
- while (isdigit(Uart_Recv[i]))
- {
- temp=(temp*10+(Uart_Recv[i]-'0'));
- i++;
- }
- if(temp>90)
- {
- printf("The calibration value must be -90 to 90!\r\n");
- }else{
- Factory_JiaoZhun=temp;
- }
- }
- break;
- case 1:
- while (isdigit(Uart_Recv[i]))
- {
- temp1=(temp1*10+(Uart_Recv[i]-'0'));
- i++;
- }
- if(temp1<10||temp1>9990)
- {
- printf("The Speed value must be 10 to 9990!\r\n");
- }else{
- Factory_Speed=temp1;
- }
-
- break;
-
- case 2:
- while (i<Uart_Recv_Index)
- {
- if (isdigit(Uart_Recv[i]))
- {
- temp1=(temp1*10+(Uart_Recv[i]-'0'));
- }
- i++;
- }
- if(temp1<1||temp1>20)
- {
- printf("The DAC value must be 0.1 to 2.0!\r\n");
- }else{
- Factory_DAC_Limit_10x=temp1;
- }
-
- break;
- }
-
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- return;
- }
-
- }
-
- memset(Uart_Recv, 0, 10); // 清空接收數(shù)據(jù)
- Uart_Recv_Index = 0;
- }
- }
復(fù)制代碼
- void Uart1Server() interrupt 4
- {
- if(RI == 1) //串口接收數(shù)據(jù)
- {
- RI = 0;
- Uart_Rx_Flag = 1; // 標(biāo)記有完整命令
- Uart_Recv_Tick = 0;
- Uart_Recv[Uart_Recv_Index] = SBUF;
- Uart_Recv_Index++;
- if(Uart_Recv_Index>10)
- {
- Uart_Recv_Index = 0;
- memset(Uart_Recv,0,10);
- }
- }
- }
復(fù)制代碼
|
|