Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: omorok 07 Srpna 2012, 14:48:42
-
Dobrý den,
Jsem naprostý začátečník v Pythonu a potřebuji pomoci.
Mám regulaci, která snímá teploty, stavy čerpadla... a posílá tyto údaje přes RS485. Mám převodník do USB, kde se mi připojí do /dev/ttyUSB0. Pokud přes terminál upravím práva ttyUSB0, a napíši cat /dev/ttyUSB0, tak každou sekundu přijdou údaje ve formě: 10,20,30,20,0,098,78,1
Může mi prosím někdo poradit, nebo nejlépe napsat program v pythonu, jak toto odchytávat a buď vkládat do nějaké proměnné (doufám, že budu schopen s tím dál pracovat), nebo ukládat do nějakého textového souboru (např. data.txt) např. v domovském adresáři. A ten si již dokáži načíst a pracovat s daty. Program by měl umět načítat bez úpravy práv v terminálu... Děkuji předem
-
Na čítanie ti bude stačiť open, na dekódovanie struct (http://docs.python.org/py3k/library/struct.html) a na konkurenčné spracovanie odporúčam multiprocessing (http://docs.python.org/py3k/library/multiprocessing.html), kde to bude treba doladiť cca. nejako takto:
def read_data(source, conn):
with open(source, "rb") as usb_file:
while True:
raw_bytes = usb_file.read(4) # 4 bajty (t.j. 32 bitové celé číslo)
conn.send_bytes(raw_bytes) # pipeline (rúra), môže byť aj queue (fronta)
parent_conn, child_conn = multiprocessing.Pipe()
p = multiprocessing.Process(target=read_data, args=("/dev/ttyUSB0", child_conn,))
p.daemon = True
p.start()
while True:
readed_bytes = parent_conn.recv_bytes(4)
number = struct.unpack(">i", raw_bytes)
print(number)
>i
Je v struct je 32 bitové číslo so znamienkom vo formáte big-endian
>
je big-endian, pre little-endian je <
i
je číslo (formát)
P.S. Kód som písal z hlavy, neviem, či to bude dobre
EDIT: multiprocessing preto, aby bolo zaručené, že vstup spracujeme okamžite po prijatí. threading by musel čakať na uvoľnenie GILu, čo nemusí nastať tak ľahko. Nové aktívne vlákno sa v threding hľadá po 100 tickoch (niečo ako kroky).
-
Děkuji za odpověď,
Přesto ale:
Především jsem v prvním dotazu nechtěně trochu (hodně) kecal. Pokud zadám do terminálu sudo cat /dev/ttyUSB0 , tak se nic nestane (občas jsou tam nějaké zmatiny- asi rušení...). Pokud spustím jako administrátor GTKterm a zvolím port ttyUSB0, tak data chodí, když teď zadám do terminálu sudo cat /dev/ttyUSB0, tak to přesměrují data z GTKterm do derminálu. Tak nevím jak na poslech přes Python.
Pokud spustím program od YaD, napíše mi terminál:
vlk@vlk-desktop ~ $ python ser.py
Traceback (most recent call last):
File "ser.py", line 12, in <module>
parent_conn, child_conn = multiprocessing.Pipe()
NameError: name 'multiprocessing' is not defined
zde dávám co spouštím:
#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
def read_data(source, conn):
with open(source, "rb") as usb_file:
while True:
raw_bytes = usb_file.read(4) # 4 bajty (t.j. 32 bitové celé číslo)
conn.send_bytes(raw_bytes) # pipeline (rúra), môže byť aj queue (fronta)
parent_conn, child_conn = multiprocessing.Pipe()
p = multiprocessing.Process(target=read_data, args=("/dev/ttyUSB0", child_conn,))
p.daemon = True
p.start()
while True:
readed_bytes = parent_conn.recv_bytes(4)
number = struct.unpack(">i", raw_bytes)
print(number)
raw_input()
Děkuji za pomoc...
-
Ja som tam neimportoval tie moduly, sorry.
Ak nechceš čítať dáta len ako admin, tak musíš upraviť práva:
$ sudo chmod 644 /dev/ttyUSB0
Len pre čítanie a...
$ sudo chmod 666 /dev/ttyUSB0
Pokiaľ to máš spravené ako pipeline (čo podľa príspevku asi nie).
Kompletne funkčný príklad: https://gist.github.com/3342790
Testoval som to na /dev/urandom, takže by to malo fungovať.
Celkom podstatná vec: open("/cesta").read je funkcia, ktorá používa tzv. blokujúce I/O, t.j. dokým nemá požadovaný vstup, tak čaká.
-
Muze to taky bejt tim, ze mas starsi python. multiprocessing je az od py 2.6. Nevim, co s tim vsechno budes delat, ale mozna by se ti moh hodit http://pypi.python.org/pypi/pyserial/2.6
-
Díval jsem se, verze Pythona je 2.7.3.
Tak jsem to spustil, data sice nějaké jdou, ale né to co potřebuji a na konci je error:
co jde z programu (je to konec programu-sám se ukončí):
1581801032
543049822
1210080840
1581785182
1214138400
1581801032
543049822
1210080840
1581785182
1214138400
1581801032
543049822
1210080840
1581785182
1214138400
1581801032
543049822
1210080840
1581785182
1579179592
1581785182
1214138400
1581801032
543049822
1214136414
1348354142
1079920734
1212309064
1581276736
-2141158023
562126408
1581785182
1214138400
1447058502
1079918686
1214138400
1581801032
543049794
1581789278
1078214750
Traceback (most recent call last):
File "s2.py", line 22, in <module>
number = struct.unpack(">i", raw_bytes)[0]
struct.error: unpack requires a string argument of length 4
to co by to mělo být a jde po sekundě z GTKterm:
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,28,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
0,0,6,30,52,29,0,0,0
Tam, kde jsou "0" ,piny nejsou zapojené, hodnoty jsou teploty... Děkuji
-
https://gist.github.com/3342790#file_read2.py
-
snad to je poslední drobnost...
vlk@vlk-desktop ~ $ python s3.py
File "s3.py", line 23
not_zero_values [int(val) for val in values if val != "0"]
^
SyntaxError: invalid syntax
-
Zabudol som tam rovná sa, sorry. Už by to malo ísť.
-
Děkuji mnohokrát YaD, teď program funguje jak má.
Musím sice po spuštění systému zadat do terminálu:
sudo chmod a+rw /dev/ttyUSB0
a
stty -F /dev/ttyUSB0 clocal cread -crtscts cs8 -cstopb hup -parenb parodd -brkint -icrnl ignbrk -igncr ignpar imaxbel -inlcr inpck -istrip -iuclc -ixany ixoff -ixon bs0 cr0 ff0 nl0 -ocrnl -ofdel -ofill -olcuc -onlcr -onlret onocr -opost tab0 vt0 -crterase crtkill -ctlecho -echo -echok -echonl -echoprt -icanon -iexten -isig -noflsh -tostop -xcase time 5 min 1
,
,ale to tak nevadí. A co dál? budu se učit Python a doufám, že program dotáhnu do konce. Teď musím k datům přiřazovat datum a čas a ukládat do souboru (uchování dat). A dál je načítat do dalšího programu, selektovat data... a nakonec vytvořit grafickou nástavbu programu. Ještě jednou děkuji za pomoc.
Můžu mít ještě jeden dotaz: nemá někdo zkušenost, nebo nezajímal se někdo o poskládání si regulace, moje představa je:
Mozek by byl nějaký mini PC (opravdu mini jen základ), k němu periferii, která by měla vstupy 0-10V a výstupy na relátka... Do počítače by se napsal ovládací program, který by na základě vstupů ovládal výstupy, ukládat data, mohl by se připojit i miny monitor, připojit internet... Děkuji
-
Raspberry Pi, BeagleBone...
-
Raspberry Pi, BeagleBone...
jj, Raspberry PI, mám na něj zálusk, jen je tu trošku větší čekací doba / pořadník... :(
Na druhou stranu již jsou schopní zasílat více kusů jednomu zákazníkovi.
Mám v plánu, že Raspberry PI půjdou přímo do starších LCD monitorů (15-19"), napájení uvnitř bývá i 12V...:
- "digitální mikroskop", tj. monitor, do kterého bude připojen USB mikroskop, nebude tedy potřeba speciální PC na pozorování a ani nebude web-okno zabírat místo na monitoru.
- "e-kuchařka", tj. monitor s netem do kuchyně primárně pro zobrazování receptů při vaření, pokud seženu, tak dotykový monitor, jinak optická myš na zdi...
- internet v jídelně/obýváku např pro návštěvy nebo prezentace zboží zákazníkům, atd...
- mini server pro vzdálené spouštění hlavního serveru skrze LAN event. přímo pomoci GPIO pinů napojených přímo na "kontakty zapínacího tlačítka", pokud bude nutné jej vzdáleně vypnout (bouřka, spotřeba elektřiny a jiné důvody...)
- "bezhlučné" přehrávání filmů do ložnice (mkv asi ne, nevím, ještě jej nemám)
http://www.root.cz/clanky/raspberry-pi-dorazil-revolucni-minipocitac-na-vlastni-kuzi/ (http://www.root.cz/clanky/raspberry-pi-dorazil-revolucni-minipocitac-na-vlastni-kuzi/)
http://www.root.cz/vyhledavani/?cx=016098403239631414888%3A7yxfxng7aus&cof=FORID%3A9&ie=UTF-8&q=raspberry&sa=Hledat&siteurl=www.root.cz%2Fzpravicky%2Fkrabicky-pro-raspberry-pi%2F&ref=&ss=3314j2048336j14 (http://www.root.cz/vyhledavani/?cx=016098403239631414888%3A7yxfxng7aus&cof=FORID%3A9&ie=UTF-8&q=raspberry&sa=Hledat&siteurl=www.root.cz%2Fzpravicky%2Fkrabicky-pro-raspberry-pi%2F&ref=&ss=3314j2048336j14)
-
Po zvládnutí základov sa odporúčam pozrieť sem: http://developer.ubuntu.com/get-started/ (je to síce pre ubuntu, ale malo by sa s tým dať pracovať aj v debiane)
Ak tam ešte pridáš py2exe, tak máš buildovací systém pre windows, debian a deriváty a s distutils v pythone aj pre rpm distra
-
Jen pro zajímavost, řešil jsem podobný problém, a měl jsem neskutečné patálie s právy /dev/ttyUSB0. Po připojení a odpojení zařízení se /dev/ttyUSB0 vygenerovalo s původními právy.
Nakonec jsem to vyřešil tak, že jsem aktuálního uživatele přidal do skupiny "dialout".
Nevím na kolik je to aktuální v Ubuntu, tohle jsem řešil v distribuci Mageia.
-
Dovolím si obnovit toto vlákno.
Na radu jsem si pořídil Raspberry Pi a nainstaloval jsem si do něho Debian+web+PHP. Jelikož jsem z Pythonem programem nepohnul dál a zjistil jsem, že totéž udělám v Bashy jednodušeji. Ale potřebuji pomoc.
Mám toto:
#!/bin/bash
sudo chmod a+rw /dev/ttyUSB0
stty -F /dev/ttyUSB0 clocal cread -crtscts cs8 -cstopb hup -parenb parodd -brkint -icrnl ignbrk -igncr ignpar imaxbel -inlcr inpck -istrip -iuclc -ixany ixoff -ixon bs0 cr0 ff0 nl0 -ocrnl -ofdel -ofill -olcuc -onlcr -onlret onocr -opost tab0 vt0 -crterase crtkill -ctlecho -echo -echok -echonl -echoprt -icanon -iexten -isig -noflsh -tostop -xcase time 5 min 1
while true; do
a=`head -n1 /dev/ttyUSB0`
echo $a
done
done
exit 0
Tady toto vypíše aktuální hodnoty viz. výše. Nepoužil jsem cat proto, že tento příkaz čeká na ukončení souboru, tím nepustí provádět další příkazy.
A potřebuji poradit jak tyto hodnoty rozhodit do jednotlivých proměnných? Myslel jsem, že použiji určení pole: např. $a[0]=nap první hodnota se určí do proměnné "nap", ale zjistil jsem, že celý řetězec je první hodnota tzv $a[0].
Maslím, že by to mělo jít pomocí
for a in ... do
....
done
ale fakt nevím jak. hodnoty se musí určovat podle čárek, může být ,0, i ,2050, ...
Děkuji
-
tak s rozhozením sloupců do proměnných je too easy pomoci příkazu awk:
awk -F "," '{print$2}'
kde parametr F udává oddělovač a $2 je číslo sloupce, který se vytáhne (za $ je konkrétní číslo sloupce)