本人在准备蓝桥杯单片机国赛,目前在学习串口的内容,自己写了代码,pc通过串口给单片机开发板发送信息,单片机接收到后根据信息做出反应。我在单片机解析串口信息这方面有些生疏,想问下各位大佬有什么好的建议或者需要优化的地方,感谢各位。以下是我根据14届单片机国赛题目,将按键控制改成了通过串口控制,以下是题目,关键代码和工程文件,希望各位大佬能不吝赐教。
14届国赛_串口.7z
(45.83 KB, 下载次数: 1)
[C] 纯文本查看 复制代码
void Uart1Server() interrupt 4
{
if(RI == 1) //串口接收数据
{
RI = 0;
Uart_Rx_Flag = 1; // 标记有完整命令
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);
}
}
}
[C] 纯文本查看 复制代码
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); // 清空接收数据
Uart_Recv_Index = 0;
return;
}
if(strcmp(Uart_Recv,"DM")==0)
{
Seg_Mode=0;
memset(Uart_Recv, 0, 10); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
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); // 清空接收数据
Uart_Recv_Index = 0;
return;
}
}
memset(Uart_Recv, 0, 10); // 清空接收数据
Uart_Recv_Index = 0;
}
}
|