Serial communication from linux/bash

 ( redman | 2018. június 1., péntek - 9:12 )

Sziasztok,

Van egy Arduino-n egy program ami soros porton tud parancsokat fogadni. Tesztelve, működik, minden rendben van vele. Arduino-IDE-t használtam a feljesztésre és tesztelésre Windowson.
Most viszont "élesben" kellene teljesítenie, de Raspberry-t használnék az utasítására.
Itt is működik a soros kommunikáció USB-n keresztül a minicom illetve a tio programmal is.
Parancssoros utasításra simán így csináltam

# echo 'DoSomeStuff' > /dev/ttyACM0 | cat < /dev/ttyACM0

Ami szépen vissza s adja a választ, de nem kapom vissza a promptot.
Gondolom azért, mert az Arduino nem zárja le a kapcsolatot.

Hogyan kell ezt kultúráltan lekezelni?
Kellene az Arduino-nak küldeni egy "végeztem" jelet és azt feldolgozni?
Az Arduino-ban próbáltam ezt:

Serial.end();
delay(2000);
Serial.begin(115200);

de a kapcsolat nem szakadt meg.

Üdv: redman

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Így nem fogod tudni megszakítani, mivel a cat csak olvas és vár a következő karakterre, nincs karakter értelmezés. Én shell helyett C vagy Python nyelvekhez nyúlok Linux esetén, ha RS232-ről van szó.
Lásd még: https://pythonhosted.org/pyserial/shortintro.html

Az Arduino UNO-n van egy USB-serial átalakító csip, és maga az Ardunio már csak seriallal kommunikál. A Serial.end() nem küld semmit, hanem a serial kommunikációt abbahagyja:

* A bejövő láb figyelését abbahagyja, ezután tehát ha jön bejövő adat, azt nem érzékeli
* A kimenő lábon nem fog többet küldeni.
* Talán a bekonfigurált értékeket az UART hardwer regisztereiben visszateszi alapállapotba.

A vevő oldalon ebből csak csend lesz.

PC oldalon a serialnak vannak vezérlőjelei, de ezek csak a USB->Serial csipig jutnak el (Arduino UNO esetén), tehát vezérlőjelet (DTR, stb) az Arduino programból már nem lehet küldeni.

A PC tud DTR-t küldeni: ha ez alacsonyba megy, akkor az Arduino USB->serial csipje reszeteli a fő processzorát, ez történik amikor programozni akarod. (Reszet után van egy rövid idő, amikor a boot program fut a főprocesszoron és ha ő kap egy megfelelő input szekvenciát, akkor programozó üzemmódba lép, nem indul el a főprogram, hanem a serialon várja az új programját.)

Száz szónak is egy a vége, az Arduino oldalról a fent leírt parancsot nem lehet megszakítani, az bizony örökre beragad. Ahogy hg2ecz írta, programból kell megnyitni a portot, és abból kezelni. A programot úgy érdemes megírni, hogy a portot konfolja fel maga:

Adatsebesség, paritás, stopbitek, DTR beállítása (mert enélkül ugye nem indul el a főcsip)

Másik megoldás lehet, hogy a program stdin-jére pájpolod az Arduino kimenetét, és az olvasó program lép ki, amikor akar. Így nem kell portot kezelni a programból, viszont a port felkonfigurálását pl minicomból kell megoldani, és aztán kilépéskor úgyhagyni.

Szerk.: eszembe jutott, hogy úgy is meg lehet csinálni, ha átengeded a bemenetet egy head parancson, az is működhet, az levágja például az első n sort, és ha szerencséd van utána zárja az inputot.

Expect
https://en.m.wikipedia.org/wiki/Expect

Van egy rakas soros portos pelda neten hozza..

Egyebkent nezd meg, hogy mukodnek a rele kartyak vagy az rfid olvasok. Mindig van keretezes. Tehat valamilyen kinevezett start byte es end byte. Valamint hibaellenorzes sem art (mondjuk CRC-32).

A chat parancsnak nézz utána.

Esetleg kiküldhetnél egy EOF-ot is a soros porton. Hátha ezt megeszi a cat (most nincs kéznél arduino, hogy kipróbáljam).


Vizsgára felkészülés végett keresek "kidobásra" szánt menedzselhető Cisco switch-eket és routereket, leginkább Pest és Bács-Kiskun megye területén.

Köszönöm a válaszokat, kipróbálom őket

http://www.redphoto.hu