uint8_t Camera_ReceiveRes(uint8_t size)
{
uint16_t timeout=0;
CameraCmdBuff.ReceiveNum = 0;
USART_ITConfig (USART3,USART_IT_RXNE,ENABLE);
while((CameraCmdBuff.ReceiveNum < size) && (timeout<0x3fff))
timeout++;
if(timeout==0x3fff) return 0;
else
{
CameraCmdBuff.ReceiveNum = 0;
USART_ITConfig (USART3,USART_IT_RXNE,DISABLE);
return 1;
}
这个是我写的函数,MCU与一个模块进行串口“发送-应答”对话,这个是我发送完信息后立刻调用,用来接受模块的回应的,CameraCmdBuff.ReceiveNum是一个变量,记录中断函数里接受到了几个字节,timeout是我定义用来防超时的一个局部变量,我嵌入式刚入门,看到有人说这个应该是存放在栈,在该函数执行过程中都不释放,ARM汇编不太会,只看出来 MOVS r4 #00,没看出来怎么在栈怎么没释放,求解。
现在情况是:串口接受中断函数里面累加的CameraCmdBuff.ReceiveNum回到这个函数就还是0, timeout也是,从中断函数回来后还是0,串口接受中断接受到的数据始终是第一个数据,其实应该是12个不同的字节。
如果我把这个函数改下,去掉超时timeout处理,没有上述问题,但是我不懂为什么,求大神指点啊。
是啊,按理不会出错的,请问您关于防超时处理或者串口的通信设计有改进的方法吗
追答防超时和你思路一样,发送之后起个定时器,时间到了可以放弃。
串口通信你可以先用缓冲区接收数据,然后轮询看有没有接收到数据,不需要堵塞起来。
谢谢了,我试了很多方法稍微改下都能通过,但是我太钻牛角,我觉得原始的这个理论上可行,心里实在硌得难受,这个我暂且放一下吧,以后再解决。