C 为什么stm32f4 uart在使用中断接收时跳过一些字符
尝试从串行Putty会话接收字符时遇到问题。当我在Putty中键入句子/多个字符以将字符发送到stm32f4微控制器时,它似乎不会使用中断方法接收所有字符 所以有两个问题: 不知道这里发生了什么。我错过什么了吗? 当为接收字符而调用中断时,我有点困惑。是为每个字符调用中断,还是用一次中断调用处理整个字符串? 代码: 油灰会议: 我在Putty中键入asdfghjkl,并使用USART_WRITE。。。作用 不单个字符不是以NUL结尾的字符数组! 您不能直接从rx中断处理程序使用轮询tx方法。当rx中断处理程序在轮询tx寄存器时被新接收的字符覆盖,这可能会导致rx溢出 您需要一个tx中断和某种缓冲区,例如循环字符队列 是的,我知道处理tx中断、循环缓冲区等有点痛苦。如果tx中断没有找到更多要发送的字符,它必须在没有发送的情况下退出。这意味着,当rx中断下一步需要将char排队发送时,它必须将其加载到tx寄存器而不是队列中,以便“初始化”tx中断机制 如果char需要遍历等待的非中断线程和/或需要阻塞到协议单元中,那么事情就变得更加“有趣”C 为什么stm32f4 uart在使用中断接收时跳过一些字符,c,interrupt,stm32,stm32f4discovery,C,Interrupt,Stm32,Stm32f4discovery,尝试从串行Putty会话接收字符时遇到问题。当我在Putty中键入句子/多个字符以将字符发送到stm32f4微控制器时,它似乎不会使用中断方法接收所有字符 所以有两个问题: 不知道这里发生了什么。我错过什么了吗? 当为接收字符而调用中断时,我有点困惑。是为每个字符调用中断,还是用一次中断调用处理整个字符串? 代码: 油灰会议: 我在Putty中键入asdfghjkl,并使用USART_WRITE。。。作用 不单个字符不是以NUL结尾的字符数组! 您不能直接从rx中断处理程序使用轮询tx方法。当r
无论如何,无论如何,您不能使用这种混合中断/轮询。它不能可靠地工作,额外的延迟将对其他中断产生不利影响,尤其是低优先级中断,这些中断将长时间处于禁用状态:“等待传输完成”-从rx中断处理程序调用时不会。这是一个非常糟糕的主意。'USART_WriteUserTX,&c;'而“str”-不!单个字符不是以NUL结尾的字符数组!使用中断从中断发送数据。那是个很坏的主意,我明白了。然后,您将如何验证rx中断是否与tx中断方法一起工作?我唯一的想法是使用USART_WRITE来验证rx中断是否正常工作。。。
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
a
s
g
k
USART_Write(USARTx,&c);
...........
while(*str)...