5201|7

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用不同串口调试软件与STC15通讯,结果不同 [复制链接]

我用了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的啊

此帖出自51单片机论坛

最新回复

遇到同样的问题,用串口助手可以接收到从站完整的报文,用modscan不行,最后咋解决的  详情 回复 发表于 2020-11-16 06:05
点赞 关注
 

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 
第一:我觉得你可以描述清楚点,有点不太清楚你的代码思路
第二:我觉得你可以数据解析不要放在中断解析,可以在中断里面把一帧数据接收完了建立个标志在main里面进行解析(STC的可能没有像32那样有空闲中断,但是你可以用个定时器20ms等接收超时来判断是否一帧数据接收完成),这样在中断里面可以快速响应。
第三,你选用的这款STC是自带仿真器的,你可以试下仿真看下数据是否丢包等问题啊。不是仅仅靠猜测来解决问题。
此帖出自51单片机论坛

点评

我就是在串口中断里把rece_end_flag置1的,然后主函数中处理  详情 回复 发表于 2018-6-11 11:34
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

板凳
 
下载看了STC的ISP下载工具,是有对你这款单片机进行仿真设置的。看了下说明,只需要消耗6K flash空间和768个字节ram。按理来说你应该足够的。不妨还是试下仿真进行分析。

此帖出自51单片机论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
此帖出自51单片机论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

5
 
RCSN 发表于 2018-6-9 23:59
第一:我觉得你可以描述清楚点,有点不太清楚你的代码思路
第二:我觉得你可以数据解析不要放在中断解析, ...

我就是在串口中断里把rece_end_flag置1的,然后主函数中处理
此帖出自51单片机论坛
 
 
 

回复

1366

帖子

6

TA的资源

版主

6
 
Modbus_Send();里面是什么内容?
我的意思是,你在串口中断不要处理什么逻辑,只管累计接收存在一个的buff,接收到一帧数据后建立标志到main处理。逻辑看起来没什么问题,就是不清楚你的相关变量是否被更改还是怎样,所以我建议的就是让你利用这个片子自带仿真器去仿真下,你接收的buf或者发送的buf是否是按照modbus协议收发的
此帖出自51单片机论坛

点评

谢谢回复,回头试试  详情 回复 发表于 2018-6-11 16:40
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

7
 
RCSN 发表于 2018-6-11 12:19
Modbus_Send();里面是什么内容?
我的意思是,你在串口中断不要处理什么逻辑,只管累计接收存在一个的buff ...

谢谢回复,回头试试
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 

遇到同样的问题,用串口助手可以接收到从站完整的报文,用modscan不行,最后咋解决的

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表