[英]Why does stm32f4 uart skip some characters when receiving using an interrupt
嘗試從串行Putty會話接收字符時遇到一些問題。 當我在Putty中鍵入句子/多個字符以將字符發送到stm32f4微控制器時,似乎沒有使用中斷方法接收所有字符。
有兩個問題:
碼:
void USART_Write(USART_TypeDef * USARTx, char * str) {
while(*str){
// First check if the Transmission Data register is empty
while ( !(USARTx->SR & USART_SR_TXE)){};
// Write Data to the register which will then get shifted out
USARTx->DR =(*str &(uint16_t) 0x01FF);
str++;
}
// Wait until transmission is complete
while ( !(USARTx->SR & USART_SR_TC)){};
}
void receive(USART_TypeDef * USARTx, volatile char *buffer,
volatile uint32_t * pCounter){
if(USARTx->SR & USART_SR_RXNE){
char c = USARTx->DR;
USART_Write(USARTx,&c);
USART_Write(USARTx,"\n\r");
}
}
void USART2_IRQHandler(void){
receive(USART2, USART2_Buffer_Rx,&Rx2_Counter);
}
油灰會議:
(我將asdfghjkl
輸入Putty,並使用USART_WRITE(...)
函數打印出接收字符)
asdfghjkl
a
s
g
k
USART_Write(USARTx,&c);
...........
while(*str)...
您不得直接通過rx中斷處理程序使用輪詢的tx方法。 當RX中斷處理程序卡住輪詢TX寄存器時,RX緩沖區將被新接收的字符覆蓋,這有可能導致RX超限。
您需要一個TX中斷和某種緩沖區,例如。 循環字符隊列。
是的,我知道處理TX中斷,循環緩沖區等有些麻煩。如果TX中斷找不到更多要發送的字符,則必須退出而沒有發送任何字符。 這意味着當下一個RX中斷需要排隊發送char時,它必須將其加載到tx寄存器而不是隊列中,以便“啟動” tx中斷機制。
如果字符需要遍歷等待的非中斷線程和/或需要阻塞為協議單元,則事情變得更加“有趣”。
無論如何,您不得使用此混合中斷/輪詢。 它不會可靠地工作,並且額外的延遲會嚴重影響其他中斷,尤其是優先級較低的中斷,這些中斷將長時間保持禁用狀態:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.