(十七)串口UART补充

文章目录

  • 引入一帧数据检测的目的
  • 实现思路
  • 部分代码
  • 现象演示


补充内容:串口一帧数据的检测(一帧数据结束判断)


引入一帧数据检测的目的

比如比赛要求我们:发送格式open\r\n开灯,close关灯

我们不能发送openxxx,xxopen,xxopenxx,close\r\n,xxclose,closexx,等类似的字符串格式误触发

或者要求我们:发送’0’开灯,'1’关灯,同样我们不能发01,10,11,00这样的字符串误操作

所以我们必须严格按照比赛数据格式来操作,避免误触发不必要的现象和结果


实现思路

(十七)串口UART补充_第1张图片

1. 先判断是否有数据接收
2. 再判断什么时候开始空闲?
3. 知道空闲后开始计时监测
4. 空闲计时达到30ms判为一帧数据结束


部分代码

//数据帧监测
bit rx_ok = 0;
void UartMoniterTask(u8 xms)//这里xms 是指 计时时间步长
{
	static u8 rx_bk = 0;
	static u8 time_cnt = 0;
	
	if(rx_cnt>0){//有数据
	//在有数据接收的 条件下 继续思路:什么时候开始空闲呢?只有知道空闲了,开始计时30ms,达到30ms才能判断为一帧数据结束
		if(rx_bk != rx_cnt){	//非空闲
			rx_bk = rx_cnt;
			time_cnt=0;
		}else{								//空闲
			if(time_cnt<30){
				time_cnt += xms ;
				if(time_cnt>=30){
					rx_ok = 1;
					time_cnt=0;
				}
			}
		}			
	}else{		//没数据
		rx_bk = 0;
		time_cnt = 0;
		rx_ok = 0;
	}
}

//串口接收
char cmd[12];
u8 rx_cnt =0 ;
void Uart1Handler()interrupt 4
{
	
	if(RI){
		RI = 0;
		if(rx_cnt<sizeof(cmd)){
			cmd[rx_cnt++] = SBUF;
		}
	}
	if(TI){
		TI = 0;
	}
}

//数据处理函数
void UartTask()
{
	if(rx_ok==1){
		rx_ok = 0;
		SendString(cmd);
		SendString("\r\n");
		if(strcmp(cmd,"open\r\n")==0){
			DeviceCtrl(0x80,0xfe);
		}
		if(strcmp(cmd,"close")==0){
			DeviceCtrl(0x80,0xff);
		}
		if(strcmp(cmd,"0")==0){
			DeviceCtrl(0x80,0xfe);
		}
		if(strcmp(cmd,"1")==0){
			DeviceCtrl(0x80,0xff);
		}
		rx_cnt =0;
		memset(cmd,'\0',sizeof(cmd));
	}
}

现象演示

效果就是,引入一帧数据检测的目的所描述的效果

(十七)串口UART补充



----- 如有错误欢迎大家批评指正!!!

你可能感兴趣的:(蓝桥杯电子类,蓝桥杯,UART,串口,单片机)