用不同串口调试软件与STC15通讯,结果不同

2019-03-24 17:01发布

我用了3个串口调试软件与IAP15W4K61S4通讯,中间是SP3232和USB转232,单片机程序是modbus RTU的程序。然后用STC下载软件查询数据可以得到返回。用另一个叫modscan32的软件却得不到返回数据。 中间我用串口监视器查看的数据,向单片机发送的数据都是对的。但modscan却得不到返回数据。另外modscan这个我经常用的,都是设置的8位数据位,9600波特率,无校验,1停止位。
我还用串口调试器.exe试过,都是正常返回的。
问题出在哪里呢?modscan用来测试modbus很直观,不想用其他的代替。
这是串口中断代码:
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
                                rece_posi=8;
                                if(rece_end_flag==0)
                                {
                                        if(rece_count==0)  //控制器地址
                                        {        
                                                if(SBUF==Load_ADDR){rece_buff[0] = SBUF;rece_count++;}
                                                else                  {rece_count = 0;rece_posi = 0;rece_end_flag = 0;}
                                        }
                                        else if(rece_count==0x01)                //功能码,正常为0x03
                                        {
                                                if(SBUF==0x03){rece_buff[1] = SBUF;rece_count++;}
                                                else                  {rece_count = 0;rece_posi = 0;rece_end_flag = 0;}
                                        }
                                        else                                           //结束判断
                                        {
                                                if(rece_count>=(rece_posi-1))          //rece_count = 2+rece_buff[1]+2
                                                {
                                                        rece_buff[rece_count] = SBUF;
                                                        rece_count = 0;
                                                        rece_posi = 0;
                                                        rece_end_flag = 1;
                                                }
                                                else
                                                {
                                                        rece_buff[rece_count] = SBUF;
                                                        rece_count++;
                                                }
                                        }
                                }
    }
}

这是主函数中的发送返回指令的代码(在while(1)里面):
                                if(rece_end_flag==1)
                                {        
                                        Modbus_Send();
                                        rece_count = 0;
                                        rece_posi = 0;
                                        rece_end_flag = 0;
                                }
这个用STC下载软件自带的串口助手可以得到返回数据,但是用modscan不行。

这是主函数中的发送返回指令的代码(在while(1)里面),加延时函数的:
                                if(rece_end_flag==1)
                                {        
                                       Delay500ms();//多加的延时函数
                                        Modbus_Send();
                                        rece_count = 0;
                                        rece_posi = 0;
                                        rece_end_flag = 0;
                                }
这个用STC下载软件自带的串口助手可以得到返回数据,用modscan也很好。并且延时20ms以上都可以正常,10ms以内不行。


从加延时前后的情况比较的话可以猜测,查询指令都是正确发送到单片机中的,但是不加延时时为什么就不送呢,rece_end_flag这个标志位应该也都是置1的啊

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。