我們在利用jlink或其他仿真器對串口中斷處理函數的數據接收進行仿真時,如果在中斷函數中設置了斷點,我們向串口發(fā)送數據端會采用逐個字節(jié)發(fā)送而不能采用一次性發(fā)送多個字節(jié),當然從廣義上來講,你一次發(fā)那么多字節(jié)我在斷點處程序已經停止了再運行肯定你的數據我會丟失啊,所以需要逐個字節(jié)發(fā)送這是可以理解的。而我這里講的是如果你一次發(fā)送多個字節(jié)將會導致什么后果的問題.
假設1:假如你的斷點設置在res = USART_ReceiveData(USART1)之后,以下面發(fā)送的這串字符為例,那么實際上當你停到斷點處看到接收到fe時由于DR寄存器之前已經清空,實際上01已經存到DR中了,這時你運行會再次運行到這個斷點,即受到了fe 和01兩個字符,接下來再運行就不會再停止了,因為后面數據已丟失。
假設2:假設你的斷點在res = USART_ReceiveData(USART1)之前,你會發(fā)現如果你仍發(fā)送這串數據那么你的程序第一次接收到fe后再運行再發(fā)什么數據都接收不到了,并且主函數也是不運行的,點擊停止要么仍在中斷中,要么在USART_GetITStatus()某處。查看手冊你p523頁關于溢出錯誤的解釋你就會明白在EXNE未清除之前再來數據會導致溢出錯誤的!??!這樣會導致程序始終陷入中斷中??!可通過接口USART_GetFlagStatus(USART1,USART_IT_ORE)進行驗證
這才是調試串口中斷處理函數不能一下發(fā)送一串字符的原因!!而不僅僅是數據會丟失問題