打印
[STC单片机]

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

[复制链接]
1766|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liyancao001|  楼主 | 2018-6-9 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liyancao001 于 2018-6-9 16:35 编辑

我用了3个串口调试软件与IAP15W4K61S4通讯,中间是SP3232和USB转232,单片机程序是modbus RTU的程序。然后用STC下载软件查询数据可以得到返回。用另一个叫modscan32的软件却得不到返回数据。 中间我用串口监视器查看的数据,向单片机发送的数据都是对的。但modscan却得不到返回数据。另外modscan这个我经常用的,都是设置的8位数据位,9600波特率,无校验,1停止位。
我还用串口调试器.exe试过,都是正常返回的。
问题出在哪里呢?modscan用来测试modbus很直观,不想用其他的代替。
又试了下,在STC单片机程序里 在发送返回数据之前做一个500ms的延时就可以接收到了。。。这是什么原因呢?
这是串口中断代码:
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也很好。


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

相关帖子

沙发
狮子fish| | 2018-6-11 18:25 | 只看该作者
你的rece_end_flag置一段在哪?

使用特权

评论回复
板凳
airwill| | 2018-6-13 20:56 | 只看该作者
这个问题, 不一定是软件问题,  
有些串口线的信号有延迟, 波形会失真, 可用示波器检测一下输出波形, 看看哪个串口线有问题吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

29

帖子

2

粉丝