RS485 - problem s komunikací

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
BigSandy
Příspěvky: 745
Registrován: 28 črc 2015, 02:00

RS485 - problem s komunikací

#1 Příspěvek od BigSandy »

Zdravím tu všechný,

Muže mi někdo říct, co dělám špatně?

Kód: Vybrat vše

void loop() {
   {
   inCount = 0;
 
 while (Serial.available() > 0)
 { 
   inString[inCount] = Serial.read();
   delay(10);  
   if (inString[inCount] == '\0') break;
   inCount++;
 }
 
 inString[inCount] = '\0'; 
  
 if (inCount > 0) { 
    String x = inString;
    x.trim();
   
// ------------------------------------------------
    if(x == "test")
    {
    digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis
    for (int i=-0; i<8;)  
    {
    Serial.print("Rele ");
    Serial.println(i);
    mcp1.digitalWrite(i,LOW);
    delay(500);
    mcp1.digitalWrite(i,HIGH);
    i++;
    }
    digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení
    }

    // ------------------------------------------------
    if(x == "A1_rele0")
    {
    digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis
    delay(500);
    Serial.println("Rele 0 hotovo ");
    digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení
   // mcp1.digitalWrite(0,LOW);
   // delay(500);
   // mcp1.digitalWrite(0,HIGH);    
    }
    // ------------------------------------------------
    if(x == "info")
    {  
    digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis 
    delay(500);
    Serial.println("A1_stav expanderu  " + info());  
    digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení   
    }
    
}
}
}

 String info() 
 { 
  String a = String(mcp1.digitalRead( 8))+ String(mcp1.digitalRead( 9))
           + String(mcp1.digitalRead(10))+ String(mcp1.digitalRead(11))
           + String(mcp1.digitalRead(12))+ String(mcp1.digitalRead(13))
           + String(mcp1.digitalRead(14))+ String(mcp1.digitalRead(15));
  return a; 
 }
Mam to na Arduino Pro Mini a tlačím to tam přes CP2102.
Normálně přes usb převodník té CP2102 to funguj.
Když však odpojím CP2102 a pustím to přes RS485 modul tak to vyzera takto.
Rele 0
Rele 1
Rele 2
Rele 3
Rele 4
Rele 5
Rele 6
Rele 7
⸮⸮Rele 0
Rele 1
Rele 2
Rele 3
Rele 4
Rele 5
Rele 6
Rele 7
Rele 0
Rele 1
Rele 2
Rele 3
Rele 4
Rele 5
Rele 6
Rele 7
⸮⸮
První býl odeslan příkaz test a ok
Pak přikaz info a vratílo to ⸮
Pak příkaz A1_rele0 a vratilo to ⸮
Pak jsem znovu zkoušel 2 X test a ok,
Pak info a A1_rele0 a zas ⸮⸮
Co je špatně?
Proč na dotaz test, třeba 100 X to funguje?
Na napájecích pinech té 485 mam už 1000 uF kondík a nepomohlo.

Už když ve void setup přidám.

Kód: Vybrat vše

  digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis 
  StavPinu = info();
  Serial.println("A1_stav expanderu  " + StavPinu); 
  digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení 
tak to zpátky pošle ⸮

Jsem zkoušel v A1_rele0 odstranit ty mezery.
Serial.print("Rele_0_hotovo");
Furt vrací ⸮

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#2 Příspěvek od Cowley »

Me se nezda ten zapis s FOR -0;
Ale treba jen neznam takto zkraceny zapis bez tretiho parametru s narustem promenne po vykonane jedne smycce.

Uživatelský avatar
BigSandy
Příspěvky: 745
Registrován: 28 črc 2015, 02:00

#3 Příspěvek od BigSandy »

Ale to je jediné, co funguje :D

V if(x == "test") to je ok

Normálně to vypíše Rele 0 až Rele 7
Naposledy upravil(a) BigSandy dne 01 dub 2018, 07:34, celkem upraveno 1 x.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#4 Příspěvek od Cowley »

Mam vyzkousene, ze je dulezite casovani.
Take je nutne vyckat s prepnutim RS485 brouka, nez se vsechna data prenesou.

Uživatelský avatar
BigSandy
Příspěvky: 745
Registrován: 28 črc 2015, 02:00

#5 Příspěvek od BigSandy »

Proto tam mam delay(500);

Kód: Vybrat vše

digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis
delay(500);
Serial.println("A1_stav expanderu  " + info());
Jak na to časovaní?
Divné je že to v té smyčce funguje spolehlivě.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#6 Příspěvek od Cowley »

Zkus dat nejakou cekacku pred prepnutim brouka do LOW.
V testu ji mas, ale pak uz ne

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#7 Příspěvek od Cowley »

To je, ale pred vlastnim vysilani. Ale uz ne po nem. A tak se to vysilani v jeho prubehu prepnutim do LOW uzamkne.

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#8 Příspěvek od lesana87 »

Nedávej tam ty delaye, místo toho dej před přepnutí na příjem Serial.flush().

Uživatelský avatar
BigSandy
Příspěvky: 745
Registrován: 28 črc 2015, 02:00

#9 Příspěvek od BigSandy »

Tak Cowley měl pravdu. :D Děkují.

Kód: Vybrat vše

if(x == "info")
    {  
    digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis 
    delay(100);
    Serial.print("A1_stav_expanderu" + info());  
    delay(100);
    digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení   
    }
lesana87 píše:Nedávej tam ty delaye, místo toho dej před přepnutí na příjem Serial.flush().
A po přepnutí na vysilaní?

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#10 Příspěvek od lesana87 »

Po přepnutí na vysílání vysílej.

Uživatelský avatar
BigSandy
Příspěvky: 745
Registrován: 28 črc 2015, 02:00

#11 Příspěvek od BigSandy »

Funguje - dik.

Kód: Vybrat vše

 if(x == "info")
    {  
    digitalWrite(2, HIGH); // nastavi pin 2 na 1 - zapis     
    Serial.print("A1_stav_expanderu" + info());  
    Serial.flush();
    digitalWrite(2, LOW); // nastavi pin 2 na 0 - čtení   
    }

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#12 Příspěvek od Cowley »

Stalo se mi, ze pri aktivni knihovne Softwareserial mi funkce Serial.flush nefungovala, proto nezbylo nez pouzit vhodne spocteny prikaz delaymicroseconds :)

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#13 Příspěvek od Le_Ze »

Zdravím, dotaz.
Doma mam natažený telefonní kabl 6 x 0,22 přes všechny místnosti a v každém pokojí na něj připojený 485 Modul a arduino.
Celkem jích je 8 a funguje to.

Už 2 dny si hrají.
2 X RS485 modul propojené a na ních arduina a normálně spolu kecaj.
Kabl co spojuje ty moduly jsem uprostřed rozstřihl a dal tam svorkovnicí a furt kecaj.
Do svorkovnice jsem přidal USB to RS485.
V notasu přes ser.monitor vidím jak spolu kecaj.
Když však do té svorkovnice připojím další modul, cela komunikace spadne.
Prostě v jednom rozpojeném mistě jsou dva RS485 modul.
Je to špatně, nebo by to mělo fungovat?

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#14 Příspěvek od lesana87 »

8 modulů na jednom kabelu funguje a tři nefungují?

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#15 Příspěvek od Le_Ze »

Ano, ale nikde nemam zapojeno v jednom mistě dvě 485.
Tak mně napadlo, jestli v tom nebude problém.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“