实现: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();
}
}