Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Novinky: Školení nejen k OS Ubuntu pro širokou veřejnost, více informací zde.

Autor Téma: Sériová komunikace - Mezi přijatými znaky se vyskytují chybné znaky  (Přečteno 355 krát)

maca2me

  • Návštěvník
  • *
  • Příspěvků: 3
  • Karma: +0/-0
    • Zobrazit profil
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.

maca2me

  • Návštěvník
  • *
  • Příspěvků: 3
  • Karma: +0/-0
    • Zobrazit profil
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.

Milhouse

  • Moderátor
  • Guru
  • *****
  • Příspěvků: 5632
  • Karma: +232/-36
    • Zobrazit profil
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. Á. V. O. D. Y.
 "...naše práce není vidět, ale je důležitá!"

Petr Merlin Vaněček

  • Moderátor
  • Závislák
  • *****
  • Příspěvků: 4934
  • Karma: +347/-11
    • Zobrazit profil
    • Lomítkáři
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 :)
Registered Linux user #421281
Stiskni CTRL + W ...
80% mozku tvoří kapalina ... u některých brzdová

maca2me

  • Návštěvník
  • *
  • Příspěvků: 3
  • Karma: +0/-0
    • Zobrazit profil
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