今天跟着江科大学stm32串口接收字节的时候遇到了一个问题,那就是我的串口只能发不能收(不能接受串口助手发过来的数据)。在这个问题卡了三个小时,终于在这两篇文章找到答案:
1)查询法:[STM32] 关于USART接收中断的BUG和注意事项_stm32串口中断函数接受数据不完整-优快云博客
2)中断法:【经验分享】USART 中断方式接收无响应问题的一种情况及其处理方法 - STM32团队 ST意法半导体中文论坛 (stmicroelectronics.cn)
一、下面是我用过但无效的方法:
1)下载前boot0置一,下载后boot0置零

在我理解就是跟51一样在stc-isp那边烧录。无效且原因不知
2)将板子自带的ttl转usb模块不供电。无效且原因不知
原文:STM32串口能发送数据,但接收不到上位机发送的数据_stm32串口只能发送不能接收-优快云博客
3)换块板子,一样问题。。。
二、我使用的且有效的办法
江科大中断源码:
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否是USART1的接收事件触发的中断
{
Serial_RxData = USART_ReceiveData(USART1); //读取数据寄存器,存放在接收的数据变量
Serial_RxFlag = 1; //置接收标志位变量为1
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除USART1的RXNE标志位
//读取数据寄存器会自动清除此标志位
//如果已经读取了数据寄存器,也可以不执行此代码
}
}
我更改后的代码:
1)查询法:
通过检查USART->DR,接收寄存器是否为空,不为空就是有数据,读出数据返回标志位
ps:本来我以为是中断法在生效,但是看了串口助手的接收端,没有收到数据,也就是说没有进入中断,因此本方法是查询法,中断判断内容是无效的,可以忽略。
void USART1_IRQHandler(void)
{
//如果中断触发
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
{
Serial_Data = USART_ReceiveData(USART1);
Serial_Flag = 1;
if(USART_GetITStatus(USART1, USART_FLAG_RXNE) == SET)
{
Serial_SendByte(Serial_Data);
//清除标志位
USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
}
}
}
2)中断法:
在江科大的NVIC配置中,串口的抢占优先级和子优先级都是1。不知道是不是程序里有别的中断函数,我将两个优先级全部改成0。中断程序可以运行。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定NVIC线路的抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //指定NVIC线路的响应优先级为0
三、总结
如果中断不进入,提高优先级。
可以通过读取寄存器判断是否接收到信息。
四、修改(改于发布后一天,又遇到这个问题)
以上写的全是**,原因只有一个,接线不稳,换几根杜邦线
1218





