Více čidel na RS485

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 17:57

Zase mám dotaz. Píšu sice RS485, ale to samé testuji i na klasickém Serial.
Jde mi o to, že když čtu čidlo - oslovím ho, tak ho přečtu, analyzuji řetězec ( viz vlákno Uložení a čtení řetězce),
a funguje. Čidlo přečtu... Vezmu jiné, s jinou adresou a taky ho přečtu atak dále a tak dále.
Ale jakmile toto oslovení a čtení dám za sebou - postupně je chci číst, tak to nejde. i když mezi ně dám dlouhou Delay.
Opomněl jsem něco? Má to nějaké pravidla... u každého čtení začínám - while (Serial.available........... a pak read....
díky za rozum.

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Více čidel na RS485

Příspěvek od kiRRow » 19 pro 2019, 18:21

kód, schéma zapojení a typy čidel ... bez toho se nehnem a budeme tu jen teoretizovat
... jo a výpis z kompilace programu ... už jsem tu i někde četl, že kod byl napsán správně, všechno se zkompilovalo .... globální proměnné zabírají 99% .......
Naposledy upravil(a) kiRRow dne 19 pro 2019, 18:32, celkem upraveno 1 x.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Více čidel na RS485

Příspěvek od ondraN » 19 pro 2019, 18:31

A jak to máš zapojené, přes ten serial? Tx z arduina můžeš jednoduše rozbočit a připojit na všechny Rx čidel. Ale Tx z čidel nemůžeš jen tak spojit a přivést na Rx arduina a to ikdyž si "povídáš" vždycky jen s jedním čidlem. Tenhle problém jsem řešil u modulů, které komunikují přes sériovou linku. V pdf příloze je schéma. Je to pro železniční modeláře (hodně polopatické), takže si musíš domyslet ty hradla uvnitř IO.
Přílohy
slucovac a rozbocovac seriove linky.pdf
(33.7 KiB) Staženo 148 x

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 18:39

No schema je jasné, vše na RS485 tam jsou všechna čidla (Serial jsem zkoušel jen pro jedno čidlo, (jako TEST).
kod je funkční, ale asi blbej :-)
a vypis z kompilace taky OK :

Volby pro sestavení se změnily; sestavuji vše znovu
Projekt zabírá 5992 bytů (18%) úložného místa pro program. Maximum je 32256 bytů.
Globální proměnné zabírají 339 bytů (16%) dynamické paměti, 1709 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.

Kód: Vybrat vše

/*
 Postupný vznik modulu čtení čidel, potom se prida neco na stisk tlačítka odeslání na Serial
 CTE DATA - z čidel - TQS1 a TQS3        - 19.12.19
*/

#include <SoftwareSerial.h>
SoftwareSerial RS485(2, 4); // RX, TX 
String inString = "";    // string to hold input
char adr;
int hodnota;
byte counter = 0;
//==================================================================================================================
void setup() {
  Serial.begin(9600); RS485.begin(9600);
 }
//==================================================================================================================
void loop() { counter++;
         if ( counter > 30 ) { counter=1;}
//.......................................................................      
  if (counter==10)  { 
      RS485.write("*BE0+045.8C");      // protokol -> *B=instrukce E0= adresa cidla a pak teplota
       while (RS485.available() > 0) {   // Read serial input:
        int inChar = RS485.read();
        inString += (char)inChar;           //PŘÍKLAD  *BE0+045.8C
      if (inChar == 'C') {
        adr = inString.charAt(2);
        hodnota = inString.substring(6,8).toInt() * 10;
        hodnota = hodnota + inString.substring(9,10).toInt();
      Serial.print(adr);
      Serial.println(hodnota);
      inString = "";
   }  }  }
//.......................................................................
  if (counter==20)  { 
      RS485.write(84);          //84,77,73,13 = TMI,13  -->  *A+024.5C
      RS485.write(77);          // u tohoto je M=adresa
      RS485.write(73);
      RS485.write(13);
       while (RS485.available() > 0) {       // Read serial input:
        int inChar = RS485.read();
        inString += (char)inChar;           //PŘÍKLAD  *BE0+045.8C
      if (inChar == 13) {
        adr = inString.charAt(1);
        hodnota = inString.substring(4,6).toInt() * 10;
        hodnota = hodnota + inString.substring(7,8).toInt();
      Serial.print(adr); Serial.print("  ");
      Serial.println(hodnota);
      inString = ""; 
   }  }  }
//.......................................................................
  if (counter==30)  {Serial.println(counter); } // dalsi cidlo
      //case 40 :  {dalsi cidlo}
      //case 50 :  {dalsi cidlo}
      //case 60 :  {dalsi cidlo}
      delay(800);
}
//==================================================================================================================

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Více čidel na RS485

Příspěvek od kiRRow » 19 pro 2019, 18:49

Zrovna tohle řešit counterem není moc šťastné ... nikdy to nijak nenačasuješ. Jel bych přes millis().
Proč se jedna komunikace začíná RS485.write("*BE0+045.8C"); a druhá uplně jinak ? Co to jeto s čím se snažíš domluvit po té RS485 ?

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 18:58

Já vím, že counter je blbost, ale pro test to je jedno. Čidlo reaguje do vteřiny a já je pak chci oslovovat třeba po 10 sec, to je jedno.
To na můj problém nemá vliv, i když tam dám 5 minut, tak to stejně nejde. Když smažu jedno, jde to, když druhé taky to jde.
Problém je asi v refreši té linky... nevím, proto se tu ptám, kde dělám blbost.
A to oslovování? No to čidlo, kde je kod v uvozovkách, nepotřebuje na konci 13 (0x0D) a to druhé ano. Neumím to jinak poslat, než po jednom,
jde to jako jeden příkaz v uvozovkách a pak tu 13. To taky nemá ale na problém vliv. To je jen určítá moje amatéřina :-)
A kdo je bude oslovovat? Teď Uno, ale pak asi MiniPro. A nadřazený systém si o to nějak řekne. Buď po Serial kodem, nebo vstupní pinem
Hi= čidla makají... Low= předej výsledky "šéfovi" :-) Ale to taky není problém...
Prostě neumím postupně oslovovat více čidel, než JEDNO ! Kde dělám chybu?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Více čidel na RS485

Příspěvek od ondraN » 19 pro 2019, 19:00

Všiml jsem si, že okamžitě po poslání něčeho čidlu, čteš z bufferu

Kód: Vybrat vše

  if (counter==10)  { 
      RS485.write("*BE0+045.8C");      // protokol -> *B=instrukce E0= adresa cidla a pak teplota
       while (RS485.available() > 0) {   // Read serial input:
        int inChar = RS485.read();
Zkus se zamyslet, co se stane, když odpověď čidla nepřijde hned. RS485.available() bude stále nulová a nezachytíš ji. Buď dej za vysílání delay nebo čekej na nenulovou hodnotu available a pak teprve čti.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Více čidel na RS485

Příspěvek od ondraN » 19 pro 2019, 19:03

A asi by bylo dobré před komunikací s čidlem vysypat všechno z přijímacího bufferu, kdyby tam náhodou zbylo nějaké smetí od jiného čidla.

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:07

No právě... to taky nejde, i když tam mezi obě čtení přidám delay(10000)... i za to vysílání jsem zkusil ...
navíc counter stejně nepustí další čtení, než je dáno...
A pak Serial má TimeOut né? Nerozumím tomu, je tam přeci If available... takže když není tak má jet dál (po TimeOutu) - cca 1sec default.
Problém bude asi jinde :-(

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Více čidel na RS485

Příspěvek od Ludek » 19 pro 2019, 19:09

Ondro, to tam je - inString = "";

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů