Více čidel na RS485
Více čidel na RS485
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.
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.
Re: Více čidel na RS485
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% .......
... 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.
Re: Více čidel na RS485
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 167 x
Re: Více čidel na RS485
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ů.
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);
}
//==================================================================================================================
Re: Více čidel na RS485
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 ?
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 ?
Re: Více čidel na RS485
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?
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?
Re: Více čidel na RS485
Všiml jsem si, že okamžitě po poslání něčeho čidlu, čteš z bufferu
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.
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();
Re: Více čidel na RS485
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.
Re: Více čidel na RS485
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
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
Re: Více čidel na RS485
Ondro, to tam je - inString = "";
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti