尝试从连续的Putty Session接收角色时遇到一些问题。当我在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缓冲区被新接收的字符覆盖,而rx中断处理程序被卡在tx寄存器中,因此可能会导致rx溢出。
你需要一个tx中断和某种缓冲区,例如。一个圆形的char队列。
是的,我知道这有点痛苦处理tx中断,循环缓冲区等。如果tx中断发现没有更多的字符发送它必须退出没有发送。这意味着当rx中断接下来需要将char排队发送时,它必须将其加载到tx寄存器而不是队列中,以便“填充”tx中断机制。
如果字符需要遍历等待的非中断线程和/或需要被阻塞到协议单元中,事情变得更加“有趣”。
无论如何,你不能使用这种混合中断/轮询。它将无法可靠地工作,额外的延迟将对其他中断产生负面影响,尤其是低优先级中断,这些中断将长时间保持禁用状态:(