搜索
bottom↓
回复: 27

RS485 Modbus 通信 每秒读一次数据,读1000次,有10多次掉包,正常吗?

[复制链接]

出0入97汤圆

发表于 2012-1-4 16:12:09 | 显示全部楼层 |阅读模式
RT,RS485总结,线不是很长,只有几米,只有一个终端。读1000次,在十几次掉包,这样算严重还是正常?!!

补充一下,产品有两个测温度的模块,有一个是PT1000转换成0~3V的模块,还一个是DS18B20。

当只用AD来测试PT1000模块,时掉包的情况,是读5000次有5到6次掉包。

当只测试DS18B20时,读18B20(读三次取中间值)时没有关中断,就1000次就有10多次掉包。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-1-4 16:14:23 | 显示全部楼层
太差,先用232短线连看

出0入0汤圆

发表于 2012-1-4 16:17:56 | 显示全部楼层
不正常,我刚做了过232的测试,从来没有看见丢过。


是不是因为处理时间太长或者385使能没控制好。

出0入0汤圆

发表于 2012-1-4 16:23:58 | 显示全部楼层
其实这还是软件的问题.仔细检查下

出0入0汤圆

发表于 2012-1-4 16:25:45 | 显示全部楼层
发送和接收转换加延时就好。

出0入0汤圆

发表于 2012-1-4 16:49:26 | 显示全部楼层
不正常,正常是不会有丢的

出0入0汤圆

发表于 2012-1-4 18:31:18 | 显示全部楼层
你的18B20用定时器实现时序比延时会好很多

出0入0汤圆

发表于 2012-1-4 18:56:36 | 显示全部楼层
如果只是通讯呢?不读取外部模块数值,是否丢包。这样能判断是不是通讯程序问题。

出0入0汤圆

发表于 2012-1-4 22:04:36 | 显示全部楼层
波特率多少啊,太大了也因响通信距离的,4800pbs 可能到1000米!

出0入97汤圆

 楼主| 发表于 2012-1-5 08:28:33 | 显示全部楼层
回复【7楼】gongnn 魔法师
如果只是通讯呢?不读取外部模块数值,是否丢包。这样能判断是不是通讯程序问题。
-----------------------------------------------------------------------

这个没试过,等下试一下。不过以前其他产品用这个RS485电路程序也差不多,是没问题的,测试了一个晚上都没掉一次。

回复【8楼】uzufk
波特率多少啊,太大了也因响通信距离的,4800pbs 可能到1000米!
-----------------------------------------------------------------------
波特率9600。


谢谢各位 的意见,等下再测试一下。

出0入97汤圆

 楼主| 发表于 2012-1-5 10:25:22 | 显示全部楼层
刚才测试了一下,如果不读数据的话,读了2000多次都没掉一次包。

但加了读数据之后就再出现了掉包的情况。

问题是我无论是AD采样,还是读18B20都没有关中断。怎么会掉包的呢。

出0入0汤圆

发表于 2012-1-5 10:48:59 | 显示全部楼层
你所谓的掉包是没有返回数据还是错误数据?是不是不正确的数值?或者有些寄存器复用了?

出0入0汤圆

发表于 2012-1-5 10:54:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-5 11:45:48 | 显示全部楼层
掉包自然是数据丢失了,没有返回。

不知楼主是一个终端一个节点,还是一个终端两个节点。不过问题肯定节点设备的问题了,问题很大可能出在程序上。

出0入0汤圆

发表于 2012-1-5 12:47:50 | 显示全部楼层
十几次肯次有点多了,不知道是从机还是主机出问题了?程序架构很重要的,好好的规划一下!

出0入97汤圆

 楼主| 发表于 2012-1-5 13:53:42 | 显示全部楼层
问题找到了,是程序的问题。CRC16校验出了问题。

由于之前的程序稍为改了一下。有些地方改漏了。就出现问题了。

void uart_isr() interrupt 4 using 3

    符合要求;
    CRC16(senddata,7);             //CRC16校验
    sendarray(senddata,9);     //发送senddata这个数组
  }

void main()

   while(1)
   {
       loaddata();//更新senddata的数据。
   }


上面是很久之前的旧程序。这样是没问题的,但不想在中断里做帮多的事,就改了一下
void uart_isr() interrupt 4 using 3

    符合要求;
    CRC16(senddata,7);
    sendbit==1


void main()

   while(1)
   {
        loaddata();//更新senddata里的数据         
        if(sendbit==1)
        {
              sendarray(senddata,9);
              sendbit=0;
        }

    }



由于改在匆忙,出现问题了。
     CRC校验还放在串口中断里,忘记放回到主程序里,这样就会导致有可能在数据发送前,senddata里面的数据被更新了,但CRC16的校验值没更新到,所以发送过去的数据CRC校验就是错误的,所以会导致有时接收到无效数据。

再改一下就OK了

void uart_isr() interrupt 4 using 3

    符合要求;
    sendbit==1


void main()

   while(1)
   {
        loaddata();//更新senddata里的数据         
        if(sendbit==1)
        {
             CRC16(senddata,7);
            sendarray(senddata,9);
            sendbit=0;
        }

    }

出0入213汤圆

发表于 2012-1-5 14:05:12 | 显示全部楼层
两头的频率是否一致啊

出0入0汤圆

发表于 2012-1-5 14:11:09 | 显示全部楼层
不正常

出0入97汤圆

 楼主| 发表于 2012-1-6 08:31:13 | 显示全部楼层
昨晚测试了一个晚上,都没有掉过一次包。


(原文件名:QQ截图20120106083016.jpg)

出0入0汤圆

发表于 2012-1-25 02:09:49 | 显示全部楼层
明显是软件问题。
    估计是在测量时,通信被什么原因停止了。

出0入0汤圆

发表于 2012-1-25 11:58:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-27 14:58:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-27 23:05:21 | 显示全部楼层
mark

出0入4汤圆

发表于 2012-1-27 23:54:10 | 显示全部楼层
这个记号  开年就会用到

出0入0汤圆

发表于 2012-1-28 19:03:08 | 显示全部楼层
wo\\我、、、、、我、、、、喜欢这里回复【23楼】vermon
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-1-31 22:18:43 | 显示全部楼层
不错的经验。标记一下。

出0入0汤圆

发表于 2013-11-9 10:44:42 | 显示全部楼层
也碰到同意问题,正在排查。

出0入0汤圆

发表于 2013-11-12 10:12:01 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表