Přepínání rs 485 na vysílání/příjem

Odpovědět
zaplik
Příspěvky: 4
Registrován: 10 bře 2021, 20:41
Reputation: 0

Přepínání rs 485 na vysílání/příjem

Příspěvek od zaplik » 10 bře 2021, 20:53

jsem s arduinem nováček a zkouším jednu wiegand čtečku připojit na Arduino NANO dle následujícího příkladu.
https://github.com/paulo-raca/YetAnothe ... rrupts.ino
Moje verze má navíc jen odesílání dat přes RS485. Všechno funguje jak má, z wiegandu se data přečtou jak mají, na usb převodník se krásně do terminálu vypíšou. Jde o to, že pokud chci data posílat přes piny RX/TX tam a zpět přes připojený MAX485, nevypiše nic nebo jen dva znaky. Maximum bylo rosypaný čaj. Takhle se to chová v případě, když se snažím vysílání/příjem 485ky řídit digitálním pinem tak, že před odesláním dám pin D8 na high a po odeslání zase na příjem low pinem D8. Nízká ani vysoká úroveň nezpůsobí to, aby stav vysílání příjmu zůstal nastavený. Přijde mi to jako kdyby ten pin ve funkci "void receivedData" nebyl schopný zůstat v nastaveném stavu. Proto se ptám, jestli je vůbec možné z této funkce pin ovládat. V hlavním vlákně odesílání funguje, ve funkci void receivedData to funguje pouze když MAX485 RE/DE připojím přímo na + nebo -. Bez pinu D8.

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

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od ondraN » 11 bře 2021, 06:56

Jaké máš arduino, jaký modul RS485, jak je to zapojené, jaký je tvůj kód, jaká je použitá knihovna pro RS485, jak je řešené přijímání dat (i tam může být chyba)? Bez těchto informací lze použít pouze křišťálovou kouli :roll:

zaplik
Příspěvky: 4
Registrován: 10 bře 2021, 20:41
Reputation: 0

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od zaplik » 11 bře 2021, 13:42

No, jak jsem Psal, modul tam není, je tam jen MAX485 zapojený dle datasheetu (modul je zbytečný a maxy používám s Raspberry Pi už 8let). MAX se ovládá DO/RE pomocí pinu D8 na Arduino Nano. Pokud se podíváš na funkci kde se vypisuje číslo karty wiegand, tak ve funkci "void receivedData(uint8_t* data, uint8_t bits, const char* message)" která je v kódu jako poslední, mám na začátku a na konci ovládání DE/RE.

digitalWrite(8, HIGH);//vysilani
uint8_t bytes = (bits+7)/8;
for (int i=0; i<bytes; i++)
{
Serial.print(data >> 4, 16);
Serial.print(data & 0xF, 16);
id[cnt]=data & 0xF;
cnt++;
}
Serial.println();
delay(100);
digitalWrite(8, LOW);//prijem

Knihovnu pro 485ku nepoužívám, z ostatních aplikací z Raspi, vím, že stačí jen přepínat vysílání/příjem. Komunikace je triviální. Proto mi nejde na rozum, že v hlavním vlákně to normálně jde, ale při volání z té funkce pro odeslání wiegandu to nejde. Není to třeba tím, že se tam volají externí knihovny wiegandu a tam ovládání digitálních pinů nejde? Příjmem to nebude. To probíhá standardně v hlavním vlákně a pokud si ručně přehazuji DE/RE na + a nebo - podle toho jestli chci vysílat nebo přijímat, tak to funguje jak má. Ale z kódu se to chová fakt divně. Programuji hodně v Delphi a Lazarusu, C pro Arduino zkouším teprve třetí den.

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

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od ondraN » 11 bře 2021, 18:13

Myslím, že problém bude v tom, že stáhneš signál pro přepnutí moc brzy. Serial pracuje s frontou, do které se výstup řadí a z ní postupně odesílá. Zkus si hlídat po provedení funkce, jestli je už fronta prázná pomocí Serial.available(), a přepni na příjem až se vyprázní.

zaplik
Příspěvky: 4
Registrován: 10 bře 2021, 20:41
Reputation: 0

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od zaplik » 11 bře 2021, 20:34

no, teď u toho nejsem, ale mohlo by teoreticky pomoct tam dát před shozením vysílání delší "delay". Teda pokud se tím nezastaví i běh funkce odesílání. To každopádně vyzkouším. Pokud to neklapne, zkusím ještě alternativně softwareserial, vytvořit nový port a zkusit to tam.
MZ

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od jankop » 11 bře 2021, 21:39

Funkce Serial.flush() je k tomu předurčena, určitě lepší než delay()

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

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od ondraN » 11 bře 2021, 23:01

Je vidět, že už jsem s tím dlouho nedělal. Serial.available() bude k ničemu, protože je to pro frontu vstupu. Flush taky nepomůže, protože ten probíhá okamžitě. Problém je, že se to nacpe do fronty a je toho větší objem, takže funkce skončí, ale data lezou ze sériáku ještě dlouho potom. Správná funkce je availableForWrite(). Vrací počet znaků, které zbývají do zaplnění fronty.

Kód: Vybrat vše

Serial.begin(9600);
int maxQ=Serial.availableForWrite();

//nastaveni pinu pro output 485
//zavolani funkce pro vystup
while(Serial.availableForWrite()<maxQ);	//cekani na vyprazdneni vystupni fronty
//nastaveni pinu pro input 485
Takhle by to mělo fungovat. Ještě bacha, u SW serial tahle funkce vrací pitomosti, takže tam nepoužívat.

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

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od ondraN » 12 bře 2021, 07:49

Tak Serial.flush() by měla v tomto případě fungovat stejně, jako to čekání na vypráznění s použitím while. Omlouvám se za chybnou informaci :oops:

zaplik
Příspěvky: 4
Registrován: 10 bře 2021, 20:41
Reputation: 0

Re: Přepínání rs 485 na vysílání/příjem

Příspěvek od zaplik » 12 bře 2021, 08:54

Dík, přesně tohle to chtělo Serial.Flush(). Teď vše chodí jak má.

Odpovědět

Kdo je online

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