- void USART1_IRQHandler(void)
- {
- uint16_t Got_Data;
- if(USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET)
- {
- Got_Data=USART_ReceiveData(USART1);//1
- delay_ms(10);//2.
- USART_SendData(USART1,Got_Data);//3
- }
-
-
- }
复制代码上面这段中断处理函数由于我故意在里面加了个10ms延时,所以造成发出的和接收的不一致。
问题是:
1.在接收到第一个数据后,进入10MS延时时,第二个数据来了,那么还会触发中断么?我看说明书是说如果读了数据寄存器,那么标志位会清0,那么即使还没有退出这个函数,但是已经可以再次触发中断了,是不是意味着重新执行这个中断函数?
2.我在电脑上的串口助手里不断向
芯片串口发送123456789,但是每次芯片发回来的只有12,请解释原因。
3.如果说现在我需要从串口接收大量数据,并逐个处理这些数据,而处理每个字节的数据要花上很多时间,可能会影响到下个数据的接收,而现在又没有大量的RAM来存储这些数据,那么有什么好的解决办法?
有什么关系吗?是不是影响程序的执行效率,还是会跟别的中断出现冲突?
嵌入式系统要保证中断短小精悍。
1,关于串口中断,你可以参考一下手册的SR寄存器第五位,关于接收中断的标志位清除方式。
如果标志位清除及时就可以申请下次中断。中断会再次进入这个函数。
2.你的程序的错误在于延时函数。这个函数会让中断函数卡死,,并且你这个程序每次输入一段数据,只会产生一次中断。
可是为什么会有两个数据发出呢?
是因为每产生一个中断其实单片机串口会接收两个数据,分别在接口移位寄存器,和DR寄存器中。所以你实际的一次中断,可以输出两个数据(1 2)的原因。
3.解决方式,目的~每次接收一个数据就要做处理。使用大一点的数组将所接收到的所有数据储存。然后写一个处理函数处理他们,然后再通过打印函数打印所有数组。
一周热门 更多>