大家好,
最近在做一个项目,用到两个串口,串口1和串口3,一开始想使用DMA的,但是最后领导让用中断实现。
具体的是这样,从串口3接收到数据,到一个缓存区,然后把这个缓存区的数据进行加工后,通过串口1发送出来。当识别到串口1发送出来的数据是正确的话,串口1就会接收到一段数据,从串口3发送出去。
但是我现在在拿串口1做测试的过程中一直有问题,串口死在中断中,好像是TXE在一直中断。请问是什么问题?
下面是我的代码:
[mw_shl_code=c,true]#define USART1_RX_LEN 256
//串口接收数据的最大缓冲区
#define USART1_TX_LEN 256
//串口发送数据的最大缓冲区,也就是串口3接收数据的最大缓冲区
extern uint16_t USART1_Rev_Buffer[USART1_RX_LEN];//定义缓冲区
extern uint16_t USART1_Send_Buffer[USART1_TX_LEN];//定义缓冲区
uint16_t USART1_Rev_Buffer[USART1_RX_LEN] = {0}; //初始化接收数据缓冲区
uint16_t USART1_RX_Num;
//实际接收数据的长度
uint16_t USART1_TX_Num;
//实际需要发送数据的长度
void SC_Reader_USARTInit(uint32_t workingbaudrate)
{
//省略串口的基本配置,金保留中断配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(SCR_USART, USART_IT_RXNE, ENABLE);//开启接收中断
USART_ITConfig(USART1,USART_IT_TC,ENABLE);//开启发送中断
}
//下面是中断服务处理函数
void USART1_IRQHandler(void)
{
//从串口1接收数据到接收缓冲区
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART1_Rev_Buffer[USART1_RX_Num++] = USART_ReceiveData(USART1);//(USART1->DR);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
//串口发送缓冲区中的数据
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
USART_SendData(USART1, USART1_Send_Buffer[USART1_TX_Num++]);
USART_ClearITPendingBit(USART1, USART_IT_TC);
}
}[/mw_shl_code]
还有第二个问题:如果我需要接收的数据大于我定义的缓冲区的最大值了,请问怎么处理?是不是直接关闭接收中断? |