Částečně nefunkční RS485

Počítačové periferie a další kategorie hardwaru, které nemají samostatnou sekci

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod ns_Navara 9. 2. 2018 16:30

Zdravím,
mám následující problém - mám zde dvě zařízení: zobrazovač v podobě LED panelu a jeho řídicí jednotku. Zařízení spolu komunikují po sběrnici RS485 pomocí celkem jednoduchých příkazů.
Kód: Vybrat vše
<adresa zobrazovače><délka příkazu><X,Y pozice textu>Text k zobrazení<CRC>

Řídicí jednotku bych chtěl nahradit vlastním SW a ovládat zobrazovač přes převodník RS232/RS485.
Problém je v tom, že znám pouze baudrate (19200) a počet bitů (8) ale neznám nastavení parity a počet stopbitů. Vyzkoušel jsem pomocí odposlechu všechny možné kombinace a poznamenal jsem si takové, kde odchycený příkaz skutečně odpovídá tomu, co se následně na zobrazovači ukáže. Když však následně zkouším odchycený příkaz odeslat z počítače přímo zobrazovači (postupně ve všech "pravděpodobných" kombinacích parity a stopbitů), ani na jednu kombinaci zobrazovač nereaguje - přestože jsem si jist, že mu posílám přesně to, co mu předtím posílala jeho řídicí jednotka.
Dotaz tedy zní: Co může způsobovat že zobrazovač "poslouchá" pouze jednotku ale moje příkazy už ne - přestože jsou vždy naprosto stejné? (Odposlechnuto od jednotky => Odesláno zobrazovači).
Napadá mě jedině známá bolístka převodníků - latence, ale USB nepoužívám, používám přímo RS232 port v počítači a převodník 232/485, a mělo by se tedy jednat o analogovou úpravu napětí, kde by se latence projevovat neměla.
ns_Navara
Kolemjdoucí

Odeslat příspěvekod Milanr1 9. 2. 2018 17:01

Nemusíš vymýšlet kolo. ;-)
Stačí prostě koupit příslušný převodník USB -> RS-485:
http://www.ftdichip.com/Products/Cables/USBRS485.htm
Milan
Milanr1
Pokročilý
Uživatelský avatar

Odeslat příspěvekod ns_Navara 9. 2. 2018 17:07

Jaké kolo, proč kolo..?
Mě nechybí HW. Převodníky tady mám různé a zkoušel jsem všechny, kromě toho mám za to, že přímo COM v PC bude spolehlivější než USB - právě z důvodu té latence.
ns_Navara
Kolemjdoucí

Odeslat příspěvekod soban 10. 2. 2018 13:02

Problém může dělat ten převodník RS232/RS485.

Protože na com portu nemusí být dostatečné napětí pro ten převodník..... správě by mělo být +3V až +15V a -3 až -15V

No a u com portu může být problém právě s tím -3 až -15V záleží odkud se toto napětí bere zda ze zdroje nebo má MB svůj měnič a nakolik se dá toto napětí zatížit a jaké napětí potřebuje ten převodník RS232/RS485 o kterém nic nevíme.....

Prostě vyskoušel bych nějaký jiný převodník pro RS485 a nebo bych místo displeje připojil nějaký přijímač RS485 a koukal zda se data přenáší OK.....
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod Kysa 10. 2. 2018 18:27

A čím posíláš ten příkaz? Vlastní sw, nebo nějaký terminál? jaké je ukončení řádku?
Kysa
Mírně pokročilý

Odeslat příspěvekod ns_Navara 11. 2. 2018 23:10

Zkoušel jsem vlastní, (Delphi7, komponenta VaComm) pak pro vyloučení chyby ve vlastním SW také jiné (Termite, 232Analyzer), všude stejné výsledky toho co na port přichází (při stejné konfiguraci parity, stopbitů). A ve všech případech při odesílání toho samého zpět na sběrnici stejný problém - displej bez reakce. Na DPS displeje jsou diody, z nichž jedna indikuje příjem zprávy, druhá odpovídání.
Když si s displejem povídá originální jednotka, blikají obě (příkaz - odpověď). Když zkusím své odesílání, blikne jen přijímací dioda, reakce se nekoná a kvitance odesílajícímu zařízení také ne.
Zítra asi povolám do zbraně měřák a biograf k ověření těch úrovní, jak psal uživatel výše.
ns_Navara
Kolemjdoucí

Odeslat příspěvekod ns_Navara 17. 3. 2018 10:51

Dokopal jsem se po všelijakých měřeních a neúspěšných pokusech až k sehnání logického analyzátoru, a výsledek je překvapivý. Problém není v úrovních ale v paritě jednotlivých bitů. Zprávy totiž vypadají tak, že první bajt má vždy paritu 1 a ostatní znaky zprávy paritu 0. Takový druh přenosu jsem v životě neviděl (i když mě to vzhledem k bastl-stylu výrobce nepřekvapuje, o něm se v jeho zemi říká že pro něj je každé kolo málo kulaté a musí vymýšlet svoje kulatější...).
O to horší bude asi něco podobného vytvořit, resp nasimulovat. Na ukázku kus jedné zprávy (znak, bin-parita):
Kód: Vybrat vše
D (0x44)          01000100-1 (parity error)               // Začátek zprávy (adresa)      
$ (0x24) 36       00100100-0               //  Délka dat (36 znaků)  OK
R (0x52)          01010010-0 (parity error)            
'1' (0x01)        00000001-0 (parity error)            
'18' (0x12)       00010010-0            
'0' (0x00)        00000000-0            
'31' (0x1F)       00011111-0 (parity error)            
'0' (0x00)        00000000-0            
A (0x41)          01000001-0            
D (0x44)          01000100-0            
R (0x52)          01010010-0 (parity error)            
: (0x3A)          00111010-0            
0 (0x30)          00110000-0            
2 (0x32)          00110010-0 (parity error)            
H (0x48)          01001000-0            
' ' (0x20)        00100000-0 (parity error)            
- (0x2D)          00101101-0            
.....atd


Existuje tedy nějaký způsob, jak přimět COM port klasického PC k tak neobvyklému zpracovávání paritního bitu?
ns_Navara
Kolemjdoucí

Odeslat příspěvekod Pytlík 17. 3. 2018 11:12

Jaké kolo, proč kolo..?
Pytlík
Pokročilý
Uživatelský avatar

Odeslat příspěvekod ns_Navara 17. 3. 2018 11:29

To nic, to měl být jen často používaný komentář toho, že dotyční zkrátka nemohou z principu své povahy použít žádný zavedený standard ale věčně musí vymýšlet nějaký svůj... Dodávají komponenty do odvětví, kam dodává i dost jiných výrobců, a místo alespoň částečného zachování kompatibility hází všem ostatním klacky pod nohy. Je to asi jako kdyby výrobce routerů řekl uživatelům Musíte si od nás koupit i počítač (nebo alespoň síťovou kartu), tiskárnu, popř. televizi, prostě všechno co chcete připojit, my totiž nepodporujeme žádnou běžnou technologii přenosu (Ethernet, WiFi...), protože my máme svou a basta.
ns_Navara
Kolemjdoucí

Odeslat příspěvekod soban 17. 3. 2018 12:28

ns_Navara píše:Dokopal jsem se po všelijakých měřeních a neúspěšných pokusech až k sehnání logického analyzátoru, a výsledek je překvapivý. Problém není v úrovních ale v paritě jednotlivých bitů. Zprávy totiž vypadají tak, že první bajt má vždy paritu 1 a ostatní znaky zprávy paritu 0. Takový druh přenosu jsem v životě neviděl (i když mě to vzhledem k bastl-stylu výrobce nepřekvapuje, o něm se v jeho zemi říká že pro něj je každé kolo málo kulaté a musí vymýšlet svoje kulatější...).
O to horší bude asi něco podobného vytvořit, resp nasimulovat. Na ukázku kus jedné zprávy (znak, bin-parita):
Kód: Vybrat vše
D (0x44)          01000100-1 (parity error)               // Začátek zprávy (adresa)      
$ (0x24) 36       00100100-0               //  Délka dat (36 znaků)  OK
R (0x52)          01010010-0 (parity error)            
'1' (0x01)        00000001-0 (parity error)            
'18' (0x12)       00010010-0            
'0' (0x00)        00000000-0            
'31' (0x1F)       00011111-0 (parity error)            
'0' (0x00)        00000000-0            
A (0x41)          01000001-0            
D (0x44)          01000100-0            
R (0x52)          01010010-0 (parity error)            
: (0x3A)          00111010-0            
0 (0x30)          00110000-0            
2 (0x32)          00110010-0 (parity error)            
H (0x48)          01001000-0            
' ' (0x20)        00100000-0 (parity error)            
- (0x2D)          00101101-0            
.....atd


Existuje tedy nějaký způsob, jak přimět COM port klasického PC k tak neobvyklému zpracovávání paritního bitu?


Teoreticky to jde před prvním znakem nastavit paritu na MARK PARITY - Paritní bit je nastaven tvrdě na log. 1, vyslat první znak a pak nastavit paritu na SPACE PARITY – Tzv. nulová parita – paritní bit je vždy v log. 0 vyslat data a tak stále dokola.....

Prostě musíš přenastavovat COM port v průběhu přenosu dat.....

Jde o to zda to ten řadič co máš v PC umí....

Viz: https://www.papouch.com/cz/website/main ... -to/rs232/

PARITA

Parita je nejjednodušší způsob, jak bez nároků na výpočetní výkon zabezpečit přenos dat. Ve vysílacím zařízení se sečte počet jedničkových bitů a doplní se paritním bitem tak, aby byla zachována předem dohodnutá podmínka sudého, nebo lichého počtu jedničkových bitů.

SUDÁ PARITA – Počet jedničkových bitů + paritní bit = SUDÉ ČÍSLO
LICHÁ PARITA – Počet jedničkových bitů + paritní bit = LICHÉ ČÍSLO

SPACE PARITY – Tzv. nulová parita – paritní bit je vždy v log. 0, používá se například při komunikaci s 7-bitového zařízení s 8-bitovým, kdy paritní bit nahrazuje tvrdou log. 0 poslední bit v byte, tím je zachována kompatibilita s 8-bitovým přenosem.

MARK PARITY - Paritní bit je nastaven tvrdě na log. 1, při kompenzaci 7-bitového provozu je třeba jej na přijímací straně nulovat, inak není kompatibilní s ASCII.
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod ns_Navara 19. 3. 2018 15:24

Svůj řadič to asi nenaučím, pokud je port otevřen, nenechá si na nastavení parity sáhnout, a pokud udělám odeslání prvního znaku, uzavření, změnu, otevření a odeslání zbytku, vznikne prodleva díky které přijímací strana pokládá rozdělený přenos za dvě různé zprávy (první neúplnou, vlastně jen adresní byte - na ten dokonce odpoví, a druhou poškozenou, které chybí adresní bajt takže je zahozena).

Řešením bude asi stavba vlastního MCU převodníku který si s jednotlivými bity přenosu dokáže takto pohrát.
ns_Navara
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Milanr1 a 0 návštevníků