问题:modbus通讯抓包,接收端偶尔出现超时的情况(超时时间80ms),字节接收之间设定的间隔是3ms(0.2ms*15)接收函数处理
static int32_t phy_recv_callback(uint8_t *buf, uint32_t len) // 串口读取数据,返回接收长度
{
uint32_t temp;
if((Uart_Rx_Frame_delay_n200us == 0)&&(Uart_Rx_point_Modbus >= 5)&&(Uart_Rx_point_Modbus <= len))
{
for(int i = 0;i < Uart_Rx_point_Modbus;i++)
{
buf[i] = Uart_Rx_Buffer_Modbus[i];
}
temp = Uart_Rx_point_Modbus;
Uart_Rx_point_Modbus = 0;
return temp;
}
else if((Uart_Rx_Frame_delay_n200us == 0)&&(Uart_Rx_point_Modbus != 0))
{
Uart_Rx_point_Modbus = 0;
return 0;
}
else
{
return 0;
}
通过仿真发现是代码意外进入了
if((Uart_Rx_Frame_delay_n200us == 0)&&(Uart_Rx_point_Modbus != 0))
此时是第一个字节接收之后,仿真显示的Uart_Rx_point_Modbus为1,奇怪的是此时Uart_Rx_Frame_delay_n200us 不为0,而是15,按道理说是不应该进入条件语句的。
使用两个定时器TIM1和TIM3,TIM1与收发轮询相关(1ms),TIM3设定为0.2ms的计时器(Uart_Rx_Frame_delay_n200us 在其中断里面处理)
之后,通过将Uart_Rx_Frame_delay_n200us 放在TIM1中断里面处理后发现不会出现超时情况,考虑到是不是中断之间存在互相打断的问题,后面修改中断的优先级(还是用两个中断)也还是会出现超时问题,所以问题的根本还没有找到,故而发出来和各位讨论一下。
会不会是中断时间太短了,而且中断优先级在我的理解应该是两个中断计时同时溢出时会优先执行优先级高的,但优先级低的会在其执行完后随即执行的吧,对逻辑顺序会有些帮助;一些浅见,不正确的地方还望指出.
目前问题已经解决,主要是沁恒芯片上AD采样通道的引脚上存在干扰导致的,给AD采样端口添加上下拉将问题解决了,中断本身没有问题。抱歉给各位提出了一个假命题。