Více čidel na RS485
Re: Více čidel na RS485
Další co by mě zajímalo je ... co udělá čidlo po tom, co příjme po RS485 zprávu, která není pro něj ?
Re: Více čidel na RS485
Podívej se na ten kód
Předpokládejme že je před RS485.write() přijímací buffer prázdný, tedy RS485.available()==0
Pak pošleš RS485.write("*BE0+045.8C");
a pak se hned ptáš while (RS485.available() > 0)
Ale v tom okamžiku je stále ještě tedy RS485.available()==0, protože se ještě pravděpodobně vysílá z vysílacího bufferu a čidlo nedostalo zatím kompletní zprávu. Takže se z toho while neprovede nic.
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();
Pak pošleš RS485.write("*BE0+045.8C");
a pak se hned ptáš while (RS485.available() > 0)
Ale v tom okamžiku je stále ještě tedy RS485.available()==0, protože se ještě pravděpodobně vysílá z vysílacího bufferu a čidlo nedostalo zatím kompletní zprávu. Takže se z toho while neprovede nic.
Re: Více čidel na RS485
Nic ignoruje jí. To šlape na 100%. Zkusil jsem tu zapojit na sběrnici 10 čidel a krásně jedno po druhém čtu.
Jak z Terminálu - s 485 převodníkem, tak i tady v tom prográmku, kdy měním kody...
Jsou to čidla od Papoucha.com TQS1 a nové TQS3. šlapou jak švýcary...
Jak z Terminálu - s 485 převodníkem, tak i tady v tom prográmku, kdy měním kody...
Jsou to čidla od Papoucha.com TQS1 a nové TQS3. šlapou jak švýcary...
Re: Více čidel na RS485
Ondro to máš asi pravdu, ale jak to, že to s jedním funguje a i když dám po vysílání delay(2000) tak ho stejně přečtu, protože visí v Bufferu.
A další čidlo je oslovováno stejně až za dlouho... i když nastavím ten můj pseudo counter na čtení po minutě
A další čidlo je oslovováno stejně až za dlouho... i když nastavím ten můj pseudo counter na čtení po minutě
Re: Více čidel na RS485
Už v momentě prvního platného přijatého znaku je něco v "bufferu" ... jenže ten znak má několik 0/1 + start a stop ... parita? ... ani náhodou se tam nestihne dostat. A pak už není counter 10 . Takže v bufferu se to hromadí ... counter je 20 ... čidlo si přečte zprávu co není pro něj ... ani ji nestihne dočíst (jestli vyprázdní buffer dřív než se to odešle celý) ... a pak už není counter 20 ...ondraN píše: ↑19 pro 2019, 19:23Podívej se na ten kódPředpokládejme že je před RS485.write() přijímací buffer prázdný, tedy RS485.available()==0Kó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();
Pak pošleš RS485.write("*BE0+045.8C");
a pak se hned ptáš while (RS485.available() > 0)
Ale v tom okamžiku je stále ještě tedy RS485.available()==0, protože se ještě pravděpodobně vysílá z vysílacího bufferu a čidlo nedostalo zatím kompletní zprávu. Takže se z toho while neprovede nic.
Re: Více čidel na RS485
No počkej, dokud cykl neopustí smyčku, tak je pořád tam kde je counter 20. Teprve pak vyleze ven a projede celý SW
a teprve znova na začatku Loop je counter +1. To taky asi nebude problém, když ostatní zakometuju - jakýkoli - a nechám běžet jen jedno.
tak nevím, asi děláme někde jinou chybu.
a teprve znova na začatku Loop je counter +1. To taky asi nebude problém, když ostatní zakometuju - jakýkoli - a nechám běžet jen jedno.
tak nevím, asi děláme někde jinou chybu.
Re: Více čidel na RS485
Pokud jedna část programu samostatně pracuje .... a druhá část samostatně pracuje taky .... a dohromady obě nefungují, tak je problém nejspíše tam, jak režíruješ jejich obsluhu současně.
Re: Více čidel na RS485
Já vím, že nic nevím...... jasně že dělám někde chybu, proto tu žádám o radu, či změnu kodu.
Prostě jak obsloužit jednoho, pak si dát pauzu a obsloužit druhého atd atd. Kde dělám chybu?
Prostě jak obsloužit jednoho, pak si dát pauzu a obsloužit druhého atd atd. Kde dělám chybu?
Re: Více čidel na RS485
Zkus u každého čidla vložit tohle"
Kód: Vybrat vše
if (counter==10) {
while(RS485.available()>0){
RS485.read();
} // vyprazdni cely prijimaci buffer
RS485.write("*BE0+045.8C"); // protokol -> *B=instrukce E0= adresa cidla a pak teplota
while(RS485.available()==0){
delay(1);
} // ceka, dokud nezacne cidlo neco posilat, pozor, pokud cidlo bude odpojene tak se odtud program nedostane, nutne zaradit nejaky timeout
//tady uz je neco v prijimacim bufferu, tak mohu zacit cist a zpracovavat
while (RS485.available() > 0) { // Read serial input:
int inChar = RS485.read();
delay(2); // male zpozdeni aby se buffer nevycetl rychleji, nez se staci plnit
inString += (char)inChar; //PŘÍKLAD *BE0+045.8C
Re: Více čidel na RS485
Zkus něco takovéhodle:
Kód: Vybrat vše
if (counter==20)
{
while (RS485.available()) // vymaže buffer, kdyby v něm náhodou byly nějaké zbytky dat z předchozích čidel
{
RS485.read();
}
// odeslání žádosti
RS485.write(84); //84,77,73,13 = "TMI"<CR>
RS485.write(77); // u tohoto je M=adresa
RS485.write(73);
RS485.write(13);
delay(800); // měření trvá až 700 ms, tak se dá ještě nějaká rezerva na přenos
while (RS485.available() > 0) // pak bych jen převedl celý přijímací buffer do řetězce
{ // Read serial input: //PŘÍKLAD "*M+020.8C"<CR>
int inChar = RS485.read();
inString += (char)inChar;
}
adr = inString.charAt(1); // na závěr z řetězce vysosat potřebné údaje
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)
{
// to samý jako při (counter==20) - kromě adresy v žádosti
}
if (counter==40)
{
// to samý jako při (counter==20) - kromě adresy v žádosti
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů