void USART1_IRQHandler(void)
{
uint8_t tmpData;
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_SendData(USART1, UsartControlBlock.TxBuffer[UsartControlBlock.IndexPointer_Tx++]);
UsartControlBlock.isSending = TRUE;
if(UsartControlBlock.IndexPointer_Tx == USART_BUFFER_SIZE_TX)
{
UsartControlBlock.IndexPointer_Tx = 0;
UsartControlBlock.isSending = FALSE;
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
tmpData = USART_ReceiveData(USART1);
if(UsartControlBlock.isRxFrameStarted == FALSE)
{
if(tmpData == FRAME_HEAD)
{
UsartControlBlock.isRxFrameStarted = TRUE;
UsartControlBlock.RxBuffer[UsartControlBlock.IndexPointer_Rx++] = tmpData;
}
} else
{
UsartControlBlock.RxBuffer[UsartControlBlock.IndexPointer_Rx++] = tmpData;
if(UsartControlBlock.IndexPointer_Rx == USART_BUFFER_SIZE_RX)
{
UsartControlBlock.isDataProcessPending = TRUE;
UsartControlBlock.isRxFrameStarted = FALSE;
}
}
}
}
串口的发送和接收都使能,发送是周期性的。
进入调试模式,在接收中断里面if(UsartControlBlock.isRxFrameStarted == FALSE)这一行设个断点。
问题现象:
如果接了外部设备,比如连接到电脑,打开串口助手,通信正常,程序运行不会中断;
但是把线断开之后,程序马上停在断点上,发现tmpData 就是上一次发送出去的值。点击‘运行’,程序又停在断点上,tmpData也是上一次发送出去的值。。。
把线连接上,再 点击‘运行’,程序还会再停一次,再 点击‘运行’,程序就连续运行不会中断了。
查看参考手册,发现有个“单线半双工通讯”模式,TX 和RX 引脚在芯片在内部是连在一起的。把这个模式禁用,问题依旧。
有没有朋友碰到过类似情况啊?
|