Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: maca2me 12 Dubna 2017, 09:04:05

Název: Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky
Přispěvatel: maca2me 12 Dubna 2017, 09:04:05
Zdravím všechny,

mám Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-70-generic x86_64) a řeším sériovou prostřednictvím /dev/ttyS0 (klasický HW COM). K počítači jej mám připojený kříženým kabelem a USB to Serial profilic. (Neměl jsem problém komunikovat takto s jiným PC s Win ani s např. Raspberry).

Posílání znaků z linuxu funguje dobře (jak přes echo na /dev/ttyS0, tak přes delphi synapse). Nevyskytují se žádné chyby, přenese se přesně znak po znaku. Při pokusu číst (opět přes synapse (recvByte i recvBuff...) i přes "cat -v < /dev/ttyS0) se během komunikace vyskytují chyby - cca každý 5tý znak. Takto vypadá vstup pokud zasílám pouze znak "X" (ať už jeden nebo více najednou). Zkoušel jsem posílat i HEX čísla atd.. výstup je stejný.

Kód: [Vybrat]
XM-XxXXXXYXXM-XXXXYXM-XM-XM-XXXXXXXZXXXX\XM-XxZXXM-XXXXXM-XXYXXXXXM-XXXXXXXM-X\XxYXXYXXxYXXXXXXX\XXXX
Na PC ze kterého posílám znaky mám windows 7 a používám střídavě Hercules a Terminal pro odesílání. Na pozadí mi běží Access Port - monitor, takže vidím co přesně odchází.

Přes stty jsem postupně nastavil RAW input a vypnul -hupcl. S tímto nastavením už je výstup alespoň čitelný ale stále mám na vstupu parazitní znaky viz ukázka. Ve vstupu je vidět jistá pravidelnost a opakujicí se parazitní znaky tudíž si nemyslím, že jsou to nahodilé chyby komunikace, spíš tam ještě zasahuje něco ze systému nebo předzpracování portu ale ani po dlouhém hledání na různých fórech jsem nic mimo RAW input nastavení nenašel.

Nastavení stty: 
Kód: [Vybrat]
root@ubuntu:~# stty -a -F /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke -flusho -extproc

Budu rád za jakoukoli radu. Díky.
Název: Re:Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky
Přispěvatel: maca2me 12 Dubna 2017, 09:28:02
Chvilku po napsání tohoto postu mi kolega přinesl jiný křížený kabel a komunikace funguje bez chyb. Minulý kabel byl upraven jako "nulový modem". Dle jeho vyjádření to někde funguje ok ale může to v některých situacích dělat problémy. Toto byla právě taková situace. Čili pro správnou komunikaci opravdu stačí nastavit Serial jako RAW. Omlouvám se za spam.
Název: Re:Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky
Přispěvatel: Milhouse 12 Dubna 2017, 17:38:45
Hned při čtení nadpisu mi bylo jasný, že to je problém s kabelem. Sám jsem takové problémy neměl, ba naopak.
Spam to určitě není, je to zkušenost. :)
Název: Re:Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky
Přispěvatel: Petr Merlin Vaněček 13 Dubna 2017, 12:56:30
Také jsem to nedávno řešil - kabel i převodník rok předtím fungoval ok a najednou porůznu chybné znaky. Stačilo trošku poškádlit piny šroubováčkem, sedřít oxidaci a vše bylo rázem růžové (to je barva válečníků!)

Takže tak :)
Název: Re:Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky
Přispěvatel: maca2me 13 Dubna 2017, 14:24:41
Právě v tom je ta největší past, jinde to fungovalo i s tímto kabelem, tak jsem pořád řešil SW problém.

Jen pro úplnost dodám, že nastavení stty pro /dev/ttyS0 jsem musel dát do /etc/rc.local jinak se to vždy při restartu hodilo do default.

Příkazy v rc.local:
Kód: [Vybrat]
stty -F /dev/ttyS0 raw
stty -F /dev/ttyS0 -echo -echoe -echok
stty -F /dev/ttyS0 -hupcl

Našel jsem i SetSerial, že by tím mělo jít uložit nastavení pro serial permanentně ale v man jsem nenašel tyto vlastnosti... Takto to funguje dobře i po restartu a odhlášení.

Díky