搜索
bottom↓
回复: 11

485多机通信 通信不正常,请帮助查问题。。。

[复制链接]

出0入0汤圆

发表于 2012-12-6 23:14:43 | 显示全部楼层 |阅读模式
现在连接 模式是 PC->无源232转485模块--->从机1---->从机2
从机上用485芯片。
现在问题是 只接一个从机通信非常稳定,接上第二个从机通信就不正常了,现象是上电只有一个从机能通信上,断电再上电可能变成另一只从机通信上了,断电再上电还可能会变。反正就是只有一个从机可以通信的上。用的modbus协议。
不知道从何查起?
硬件?软件?

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

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

出0入0汤圆

 楼主| 发表于 2012-12-6 23:22:38 | 显示全部楼层
本帖最后由 281229961 于 2012-12-6 23:29 编辑

代码如下
  1. void USART1_IRQHandler(void)                        //串口1中断服务程序
  2.         {
  3.         u8 Res;
  4.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  5.                 {
  6.                 Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
  7.                    if(Res==addr&USART_RX_STA==0)        //接收到起始信号
  8.                 {
  9.                     USART_RX_BUF[USART_RX_STA]=Res;
  10.                     USART_RX_STA=1;
  11.                 }               
  12.                 else if (USART_RX_STA!=0)
  13.                 {   
  14.                     USART_RX_BUF[USART_RX_STA]=Res;
  15.                     USART_RX_STA++;
  16.                 }
  17.                 }                    
  18. if ( USART_RX_STA>7)
  19. checkComm0Modbus();
  20. }

  21. void  readRegisters(void)
  22. {
  23.     unsigned int regaddr,byteCount,i;
  24.     unsigned int num;
  25.     unsigned int Data;
  26.        regaddr=USART_RX_BUF[3]+(USART_RX_BUF[2]<<8);//要读取的寄存器起始地址
  27.         num=USART_RX_BUF[5]+(USART_RX_BUF[4]<<8);//要读取的寄存器数量
  28.         USART_TX_BUF[0]=addr;
  29.         USART_TX_BUF[1]=0x03;
  30.         USART_TX_BUF[2]=2*num; //字节数=寄存器数量*2
  31.         for(i=0;i<num;i++)
  32.         {
  33.             USART_TX_BUF[3+i*2]=buf[regaddr+i+1]>>8;
  34.             USART_TX_BUF[4+i*2]=buf[regaddr+i+1];
  35.                         //addr+1+i:         解释如下
  36.                         //由于上位机读写没有0号地址          上位机读写的起始地址为 读写4WB0001对应于下位机的0号地址
  37.                         //为了便于上下位机读写地址对应, 所以下位机地址在收发的时候加 1
  38.                         // 比如上位机  读写4WB0001->00        16位读写
  39.                         // 则下位机           反馈 buf[1]                16位数组         
  40.                         // 这样的话    读写4WB0001->buf[1]         读写4WB0002->buf[2]  。。。。。
  41.                         // (buf[0]就再也用不到了)
  42.                     //否则不加 1 的 话         读写4WB0001->buf[0]         读写4WB0002->buf[1]  。。。。。
  43.                         //纯属个人习惯!!!
  44.         }
  45.         byteCount=3+2*num;//CRC校验的字节数
  46.         Data = CRCC16(USART_TX_BUF,byteCount);
  47.         USART_TX_BUF[num*2+3]=Data>>8;   
  48.         USART_TX_BUF[num*2+4]=Data&0xff;
  49.         Uart_send_n(USART_TX_BUF,byteCount+2);
  50.       //  IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x80);//接收中断使能
  51. }

  52. void presetMultipleRegisters(void)//多寄存器设置
  53. {   
  54.     unsigned int regaddr,num,i;
  55.     unsigned int crcData;
  56.     //unsigned int tempData;
  57.     regaddr=USART_RX_BUF[3]+(USART_RX_BUF[2]<<8);
  58.     num=USART_RX_BUF[5]+(USART_RX_BUF[4]<<8);
  59.     for(i=0;i<num;i++)
  60.         {
  61.             buf[regaddr+1+i]=USART_RX_BUF[8+i*2]+(USART_RX_BUF[7+i*2]<<8);
  62.                         //addr+1+i:         解释如下
  63.                         //由于上位机读写没有0号地址          上位机读写的起始地址为 读写4WB0001对应于下位机的0号地址
  64.                         //为了便于上下位机读写地址对应, 所以下位机地址在收发的时候加 1
  65.                         // 比如上位机  读写4WB0001->00        16位读写
  66.                         // 则下位机           反馈 buf[1]                16位数组         
  67.                         // 这样的话    读写4WB0001->buf[1]         读写4WB0002->buf[2]  。。。。。
  68.                         // (buf[0]就再也用不到了)
  69.                     //否则不加 1 的 话         读写4WB0001->buf[0]         读写4WB0002->buf[1]  。。。。。
  70.                         //纯属个人习惯!!!
  71.         }
  72.         USART_TX_BUF[0]=addr;
  73.         USART_TX_BUF[1]=0x10;
  74.         USART_TX_BUF[2]=USART_RX_BUF[2];
  75.         USART_TX_BUF[3]=USART_RX_BUF[3];
  76.         USART_TX_BUF[4]=USART_RX_BUF[4];
  77.         USART_TX_BUF[5]=USART_RX_BUF[5];
  78.         crcData = CRCC16(USART_RX_BUF,6);
  79.         USART_TX_BUF[6]=crcData>>8;   
  80.         USART_TX_BUF[7]=crcData;
  81.         Uart_send_n(USART_TX_BUF,8);
  82.        // Recover();
  83.        // IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x80);//接收中断使能
  84. }

  85. void checkComm0Modbus(void)
  86. {
  87.     unsigned int crcData;
  88.     unsigned int tempData;//数据个数
  89.     if(USART_RX_STA > 4)
  90.     {switch(USART_RX_BUF[1])
  91.         {
  92.             case 3://读取保持寄存器(一个或多个)
  93.                     if(USART_RX_STA >= 8)
  94.                     {//接收完成一组数据
  95.                         //应该关闭接收中断
  96.                       //  IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x0);//关闭接收中断
  97.                         if(USART_RX_BUF[0]==addr)    // && checkoutError==0)
  98.                         {
  99.                             crcData = CRCC16(USART_RX_BUF,6);
  100.                             if(crcData == USART_RX_BUF[7]+(USART_RX_BUF[6]<<8))
  101.                             {//校验正确
  102.                                  if(USART_RX_BUF[1] == 3)
  103.                                 {//读取保持寄存器(一个或多个)
  104.                                     readRegisters();
  105.                                 }
  106.                              }
  107.                          }            
  108.                       USART_RX_STA = 0;      
  109.                      // checkoutError = 0;
  110.                     } break;
  111.             case 16://设置多个寄存器
  112.                     tempData = (USART_RX_BUF[4]<<8) + USART_RX_BUF[5];
  113.                     tempData = tempData * 2;    //数据个数计算=寄存器数*2+9
  114.                     tempData += 9;              //数据个数
  115.                     if(USART_RX_STA >= tempData)
  116.                     {  // IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x0);//关闭接收中断
  117.                         if(USART_RX_BUF[0]==addr)
  118.                         {
  119.                             crcData = CRCC16(USART_RX_BUF,tempData-2);
  120.                             if(crcData == (USART_RX_BUF[tempData-2]<<8)+ USART_RX_BUF[tempData-1])
  121.                             {
  122.                                 presetMultipleRegisters();         
  123.                             }
  124.                         }   
  125.                         USART_RX_STA = 0;
  126.                     }
  127.                     break;
  128.                     
  129.             default:
  130.                     break;         
  131.         }
  132.     }
  133. }
复制代码

出0入0汤圆

发表于 2012-12-6 23:22:55 | 显示全部楼层
从机的modbus地址设置成不一样了吗?
485通讯线上有加匹配电阻吗?

出0入0汤圆

 楼主| 发表于 2012-12-6 23:30:47 | 显示全部楼层
zml 发表于 2012-12-6 23:22
从机的modbus地址设置成不一样了吗?
485通讯线上有加匹配电阻吗?

地址设置成不一样的了

通信线只有2m长 没有加匹配电阻

出0入0汤圆

发表于 2012-12-6 23:54:54 | 显示全部楼层
从现象上看,像是软件问题。这么长的程序,不一定有人帮你找bug,自己仔细检查一下吧
硬件方面,所有端点,包括所有主机从机的地线连起来试一下

出0入0汤圆

发表于 2012-12-7 00:01:42 | 显示全部楼层
用串口监视 (模式是 PC->无源232转485模块) 接到AB端 看收发资料就可确定
你那485程式 应该没错 跟我使用的一样 我用再PIC上

出0入0汤圆

发表于 2012-12-7 18:51:03 | 显示全部楼层
有个软件,叫modbus poll,可以用来测试。要先分开是软件问题还是硬件问题。

出0入0汤圆

 楼主| 发表于 2012-12-7 19:06:46 | 显示全部楼层
zml 发表于 2012-12-7 18:51
有个软件,叫modbus poll,可以用来测试。要先分开是软件问题还是硬件问题。 ...

谢谢 周一再测试了

出20入12汤圆

发表于 2012-12-7 20:40:27 | 显示全部楼层
收发控制脚在作怪,话说没有看到是如何控制这个管脚的

出0入0汤圆

 楼主| 发表于 2012-12-7 22:45:35 | 显示全部楼层
gaolf_2012 发表于 2012-12-7 20:40
收发控制脚在作怪,话说没有看到是如何控制这个管脚的

在  Uart_send_n 这个函数里面的

一对一通信完全正常 测试一整天 都很好

出20入12汤圆

发表于 2012-12-8 07:43:43 | 显示全部楼层
一对一帧间隔是多少?丢帧不?如果从机程序的控制脚处于发送状态太长,并且超过帧间隔的话会影响总线。另外你的Uart_send_n 函数我真的没找到啊

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:17

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

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