用不同串口调试软件与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的啊

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
RCSN
1楼-- · 2019-03-24 22:17
第一:我觉得你可以描述清楚点,有点不太清楚你的代码思路
第二:我觉得你可以数据解析不要放在中断解析,可以在中断里面把一帧数据接收完了建立个标志在main里面进行解析(STC的可能没有像32那样有空闲中断,但是你可以用个定时器20ms等接收超时来判断是否一帧数据接收完成),这样在中断里面可以快速响应。
第三,你选用的这款STC是自带仿真器的,你可以试下仿真看下数据是否丢包等问题啊。不是仅仅靠猜测来解决问题。
RCSN
2楼-- · 2019-03-24 22:25
 精彩回答 2  元偷偷看……
LArray
3楼-- · 2019-03-25 02:29
liyancao001
4楼-- · 2019-03-25 05:32
RCSN 发表于 2018-6-9 23:59
第一:我觉得你可以描述清楚点,有点不太清楚你的代码思路
第二:我觉得你可以数据解析不要放在中断解析, ...

我就是在串口中断里把rece_end_flag置1的,然后主函数中处理
RCSN
5楼-- · 2019-03-25 09:53
 精彩回答 2  元偷偷看……
liyancao001
6楼-- · 2019-03-25 10:23
RCSN 发表于 2018-6-11 12:19
Modbus_Send();里面是什么内容?
我的意思是,你在串口中断不要处理什么逻辑,只管累计接收存在一个的buff ...

谢谢回复,回头试试

一周热门 更多>