深夜发帖,只因为STM32串口有关问题郁闷得睡不着
深夜发帖,只因为STM32串口问题郁闷得睡不着
就是我运行串口大师,设置完成后,RX不断接收数据,大多数为00.也有其他的。且速度越来越快,请问是什么原因?而自己发的数据很难看到。求解,等一晚上。如需其他代码也可一并贴上。
附中断函数代码
void USART1_IRQHandler(void) //串口1 中断服务程序,收到的字符回显到终端上
{
unsigned int i;
// GPIO_SetBits(GPIOC, GPIO_Pin_1);//点亮Led1测试是否进入中断
// GPIO_ResetBits(GPIOC, GPIO_Pin_1);
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
/* Read one byte from the receive data register */
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //将读寄存器的数据缓存到接收缓冲区里
if(RxBuffer1[RxCounter1-2]==0x0d) //判断结束标志是否是0x0d
{
for(i=0; i< RxCounter1; i++)
TxBuffer1[i] = RxBuffer1[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发
rec_f=1; //接收成功标志
Rec_Len=RxCounter1;
RxCounter1=0;
// for(i=0; i<Rec_Len; i++)
// USART_SendData(USART1,TxBuffer1[i]+2);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //USART_FLAG_TC发送完成标志位
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) // USART_IT_TXE,发送中断
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_ITConfig()使能或失能USART中断
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) //发送完成状态
{
tx_flag=1;
}
}
------解决方案--------------------
只要你把GPIO配置与板子一致,一般地,用ST的库是能正常工作的。
嗨,我现在搞它的USB,搞得头都大了
------解决方案--------------------
中断服务子函数中不要用 for循环,用if 通过多次进入中断处理。 还有发送中断要选择 发送寄存器空模式 或者 发送完中断模式 二选一 而不是两个都写,注意,进入中断后,软件清除中断标志位。
------解决方案--------------------
中断标志 是 硬件自动清除还是 软件清除????
就是我运行串口大师,设置完成后,RX不断接收数据,大多数为00.也有其他的。且速度越来越快,请问是什么原因?而自己发的数据很难看到。求解,等一晚上。如需其他代码也可一并贴上。
附中断函数代码
void USART1_IRQHandler(void) //串口1 中断服务程序,收到的字符回显到终端上
{
unsigned int i;
// GPIO_SetBits(GPIOC, GPIO_Pin_1);//点亮Led1测试是否进入中断
// GPIO_ResetBits(GPIOC, GPIO_Pin_1);
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
/* Read one byte from the receive data register */
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //将读寄存器的数据缓存到接收缓冲区里
if(RxBuffer1[RxCounter1-2]==0x0d) //判断结束标志是否是0x0d
{
for(i=0; i< RxCounter1; i++)
TxBuffer1[i] = RxBuffer1[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发
rec_f=1; //接收成功标志
Rec_Len=RxCounter1;
RxCounter1=0;
// for(i=0; i<Rec_Len; i++)
// USART_SendData(USART1,TxBuffer1[i]+2);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //USART_FLAG_TC发送完成标志位
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) // USART_IT_TXE,发送中断
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_ITConfig()使能或失能USART中断
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) //发送完成状态
{
tx_flag=1;
}
}
------解决方案--------------------
只要你把GPIO配置与板子一致,一般地,用ST的库是能正常工作的。
嗨,我现在搞它的USB,搞得头都大了
------解决方案--------------------
中断服务子函数中不要用 for循环,用if 通过多次进入中断处理。 还有发送中断要选择 发送寄存器空模式 或者 发送完中断模式 二选一 而不是两个都写,注意,进入中断后,软件清除中断标志位。
------解决方案--------------------
中断标志 是 硬件自动清除还是 软件清除????