查看: 1607|回复: 2
|
Arduino RS485
[复制链接]
|
|
请问下你们有遇到我类似这问题吗?
一电脑会一直从RS485发送信息给4 个arduino,每一次发送时间是55ms。baudrate=9600。当然arduino会用dip switch。
比如arduino A 收到电脑发送的信息,它会回复给回电脑, 如果信息是属于arduino A,如果不是会忽略掉。其他arduino B,C和D也是一样。
有时候当arduino 会收电脑发送的信息,不会回复,大概十次有一次没有。arduino越多就会也严重。
比如:电脑发:@01T
arduino A: @01R
是timing的问题吗?我可以肯定的是电脑发出来的信息是对的。请大大帮忙下,小弟已经做了很久。
- //RS-485 config
- #include <SoftwareSerial.h>
- /*-----( Declare Constants and Pin Numbers )-----*/
- #define SSerialRX 11 //Serial Receive pin 10
- #define SSerialTX 10 //Serial Transmit pin 12
- #define SSerialTxControl 12 //RS485 Direction control 11
- #define RS485Transmit LOW
- #define RS485Receive HIGH
- SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
- int index = 0;
- char inData[4]; // Arrays should be even sizes
- void setup()
- {
- //RS-485...................
- pinMode(SSerialTxControl, OUTPUT);
- digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver
- RS485Serial.begin(9600); // set the data rate
-
- }
- void loop()
- {
- digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit
-
-
- while(RS485Serial.available())
- {
- receive_data();
- digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit
-
- if(inData[0]==0x40)
- {
-
- if(inData[1]==0x30&&inData[2]==0x31&&inData[3]==0x54) //Testing(request)
- {
- RS485Serial.write(0x40); //@
- RS485Serial.write(0x30);
- RS485Serial.write(0x31);
- RS485Serial.write(0x52); //R
- break;
- }
-
- }
- }
-
- void receive_data(void)
- {
-
- for(index=0;index<4;index++)
- {
- inData[index] =(unsigned char)(RS485Serial.read());//
- //delay 2ms ,if not maybe lost data occurs
- delay(1);
- }
- }
复制代码 本帖最后由 note2 于 7-8-2014 12:45 PM 编辑
|
|
|
|
|
|
|
|
发表于 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一次以确定问题。
如果要做通讯,最好能买一个逻辑分析仪 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|