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