佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1536|回复: 2

Arduino RS485

[复制链接]
发表于 7-8-2014 12:13 PM | 显示全部楼层 |阅读模式
请问下你们有遇到我类似这问题吗?


一电脑会一直从RS485发送信息给4 个arduino,每一次发送时间是55ms。baudrate=9600。当然arduino会用dip switch。



比如arduino A 收到电脑发送的信息,它会回复给回电脑, 如果信息是属于arduino A,如果不是会忽略掉。其他arduino B,C和D也是一样。


有时候当arduino 会收电脑发送的信息,不会回复,大概十次有一次没有。arduino越多就会也严重。

比如:电脑发:@01T
arduino A: @01R

是timing的问题吗?我可以肯定的是电脑发出来的信息是对的。请大大帮忙下,小弟已经做了很久。


  1. //RS-485 config
  2. #include <SoftwareSerial.h>
  3. /*-----( Declare Constants and Pin Numbers )-----*/
  4. #define SSerialRX        11  //Serial Receive pin    10
  5. #define SSerialTX        10  //Serial Transmit pin   12
  6. #define SSerialTxControl 12   //RS485 Direction control  11

  7. #define RS485Transmit    LOW
  8. #define RS485Receive     HIGH
  9. SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX



  10. int index = 0;   
  11. char inData[4]; // Arrays should be even sizes     




  12. void setup()
  13. {
  14. //RS-485...................
  15.   pinMode(SSerialTxControl, OUTPUT);   
  16.   digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver  
  17.   RS485Serial.begin(9600);   // set the data rate  
  18.   
  19. }





  20. void loop()
  21. {
  22. digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit  



  23.    while(RS485Serial.available())
  24. {
  25.     receive_data();
  26.     digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit
  27.    
  28.    if(inData[0]==0x40)
  29.    {
  30.    
  31.        if(inData[1]==0x30&&inData[2]==0x31&&inData[3]==0x54)             //Testing(request)
  32.           {
  33.             RS485Serial.write(0x40);          //@   
  34.             RS485Serial.write(0x30);      
  35.             RS485Serial.write(0x31);   
  36.             RS485Serial.write(0x52);          //R
  37.           break;
  38.           }
  39.       
  40.    }
  41. }


  42. void receive_data(void)      
  43. {


  44.   for(index=0;index<4;index++)
  45.    {
  46.       inData[index] =(unsigned char)(RS485Serial.read());//
  47.       //delay 2ms ,if not maybe lost data occurs
  48.        delay(1);
  49.    }

  50. }


复制代码
本帖最后由 note2 于 7-8-2014 12:45 PM 编辑

回复

使用道具 举报


ADVERTISEMENT

发表于 7-8-2014 05:29 PM | 显示全部楼层
硬体怎样接? 用什么RS485 芯片?
RS485 的线多长?
线如何接?(你如何loop, 不会用文字写的话, 就放清晰的照片)
明白了才能回复。。

P/s: 最好能看版规 本帖最后由 pic 于 7-8-2014 05:30 PM 编辑

回复

使用道具 举报

发表于 16-8-2014 09:15 PM | 显示全部楼层
可能的原因:
1、协议错误:
没有考虑到总线的冲突检测逻辑,举例来讲:PC向A发查询包,A收到了,A发回复,这时候B,C,D都会收到A的回复。这里面可能发生的问题是PC发B查询的时候正好是A发回复的时候,总线上有冲突,所有收到的会是重叠的错误数据。或着PC发B查询时,B在处理A回复给PC的数据。
你可以更改PC的程序,发A查询,收到A回复才发B的查询。建议参考一下成熟的规约,协议,这里会有冲突处理的算法。

2、总线速率的问题:RS485是差分总线,收发在同一线上,速度太慢会来不及收发。
解决的方法:提高BAND试一下,看情况是否能有改善,或者延长PC发送的周期,改成110ms一次,或者1s一次以确定问题。


如果要做通讯,最好能买一个逻辑分析仪
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-4-2024 08:15 AM , Processed in 0.066284 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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