用超时法可以握手成功,但感觉超时法还要用上一个定时器很麻烦,网上搜了搜有利用空闲中断接受不定帧数据的,然后找到了原子哥发的那个modbus的例子,在普通的串口初始化里加了两句程序: USART2->CR1|=1<<4; //开启串口总线空闲中断.
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
然后中断函数这样子:
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);
if((USART_RX_STA&0x8000)==0)//接收未完成
{
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}
else if(USART2->SR&(1<<4)) //空闲中断
{
res=USART2->DR; //读SR,DR,清除IDLE位
USART2_RX_STA|=1<<15; //标记接收完成
}
}
}
看了下手册,好像也没什么错误,还是说有什么设置重复冲突了。
请求帮助!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
没办法换回超时法了,,,谢谢原子哥
一周热门 更多>