初级会员
- 积分
- 57
- 金钱
- 57
- 注册时间
- 2021-12-17
- 在线时间
- 23 小时
|
1金钱
在串口通信的例子里面,我在中断服务函数部分加了一段led灯(红色部分),想让数据返回电脑的串口调试助手后,灯亮灭一下。结果发现,灯竟然会亮两次,而且传回调试助手的数据是缺少的。比如调试助手发出123,结果传回来1,隔一小会回传2,然后就没了。经过反复试验发现间隔、丢失、灯亮两次这些问题是与 delay_ms(500);有关 ,。我猜这个是与串口的传输特点有关,有大神知道为什么吗?在USART_SendData(USART1,res);语句附近不能有延时语句是吗?
/*中断服务函数*/
void USART1_IRQHandler(void) //中断服务函数在启动文件startup_stm32f10x_hd.s 79-139行找到每个中断对应的名字
{u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)) //判断是否是串口接收产生的中断,如果是,则读取串口接收到的数据
{ res=USART_ReceiveData(USART1); //读取串口接收到的数据,USART_ReceiveData(USART1)函数可以读取串口接收到的数据
USART_SendData(USART1,res); //把数据发送出去
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //输出低电平 灯亮
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //输出低电平 灯亮
delay_ms(500); //延时500毫秒
GPIO_SetBits(GPIOA,GPIO_Pin_8); //输出高电平 灯不亮
GPIO_SetBits(GPIOD,GPIO_Pin_2); //输出高电平 灯不亮
delay_ms(500); //延时500毫秒
}
}
|
最佳答案
查看完整内容[请看2#楼]
delay_ms(500); 不应该出现在中断服务函数里。如果delay_ms是通过systic实现,那肯定会导致异常。最简单的方法,纯FOR循环做一个延时函数,然后验证一下。
|