单片机串口接收 中断超时3ms读取 代码实现

实现:3ms串口接收中断没有接收到数据 就读取判断并回复

           1.定时器开启3ms进一次中断(由于每款单片机设置不一样 这儿就不具体写了)
           2.在定时器中断函数中写入一个变量SysClock用来记录进入中断次数       
void Timer0_ISR(void)
{
    SysClock++;
    TIM_ClearITflag(TIM0);  //  清除 中断标志位
}    
            3.另外写一个函数TimeComp 作比较两个变量的差 
uint32_t TimeComp(uint32_t time)
{
    return (SysClock - time);
}    

   

         4.在串口接收中断里 接受字节 并写入一个变量ReceTimeOver 让这个变量等于SysClock
        (这个函数放在main中)

注:每次串口接收到数据都会进入 所以ReceTimeOver一直等于SysClock 一旦没有数据了 接收中断函数便不进了 这回ReceTimeOver便不等于SysClock(因SysClock在定时器中还是不断增加)

//串口接收运行
void Uart_Rx_Run(void)
{
    //进串口接收中断
	if( UART_GetFlagStatus(UART_Flag_RNE)){
	UART_ClearFlag(UART_Flag_RNE);
    //接收字节
    uasrt0_rx_buff[uasrt0_rx_sta] = UART_ReceiveData();
    //如果没溢出就不停接收
    if(uasrt0_rx_sta+1 < sizeof(uasrt0_rx_buff)){uasrt0_rx_sta++;}
    //只要接收字节 两变量就没有差值
	ReceTimeOver = SysClock;
  }

}
            5.判断两个变量的差值是否大于3ms 如果大于就说明3ms没有接收到数据了 就可以读取了
            (这个函数放在main中就可以了)
void SlaveCommunProtocol(void)
{
    //3ms没中断数据进来
	if((uasrt0_rx_sta == 0) || (TimeComp(ReceTimeOver) <= 3)){return;}
    //判断帧头
    if((uasrt0_rx_buff[0] == 0xFF) && (uasrt0_rx_buff[1] == 0x0A))
    {  
	//回复函数写在这儿
	}
    //这里把收取数据的字符串长度置零 下次接收又从0位开始接收
    uasrt0_rx_sta = 0;
	}

main

int main(void){
	while(1){
        Uart_Rx_Run();
        SlaveCommunProtocol();
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值