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

Název: Python /dev/ttyUSB0
Přispěvatel: 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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: YaD 08 Srpna 2012, 01:44:11
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:
Kód: [Vybrat]
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)

Kód: [Vybrat]
>i Je v struct je 32 bitové číslo so znamienkom vo formáte big-endian
Kód: [Vybrat]
> je big-endian, pre little-endian je <
Kód: [Vybrat]
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).
Název: Re:Python /dev/ttyUSB0
Přispěvatel: omorok 13 Srpna 2012, 19:32:11
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:
Citace
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:
Citace
#! /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...
Název: Re:Python /dev/ttyUSB0
Přispěvatel: YaD 13 Srpna 2012, 20:16:47
Ja som tam neimportoval tie moduly, sorry.

Ak nechceš čítať dáta len ako admin, tak musíš upraviť práva:
Kód: [Vybrat]
$ sudo chmod 644 /dev/ttyUSB0Len pre čítanie a...
Kód: [Vybrat]
$ sudo chmod 666 /dev/ttyUSB0Pokiaľ 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á.
Název: Re:Python /dev/ttyUSB0
Přispěvatel: starenka 13 Srpna 2012, 23:11:11
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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: omorok 14 Srpna 2012, 06:00:03
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čí):
Citace
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:
Citace
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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: YaD 14 Srpna 2012, 17:58:13
https://gist.github.com/3342790#file_read2.py
Název: Re:Python /dev/ttyUSB0
Přispěvatel: omorok 14 Srpna 2012, 19:25:13
snad to je poslední drobnost...

Citace
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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: YaD 14 Srpna 2012, 23:22:37
Zabudol som tam rovná sa, sorry. Už by to malo ísť.
Název: Re:Python /dev/ttyUSB0
Přispěvatel: omorok 18 Srpna 2012, 19:12:16
Děkuji mnohokrát YaD, teď program funguje jak má.
Musím sice po spuštění systému zadat do terminálu:
Citace
sudo chmod a+rw /dev/ttyUSB0
a
Citace
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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: starenka 18 Srpna 2012, 22:28:56
Raspberry Pi, BeagleBone...
Název: Re:Python /dev/ttyUSB0
Přispěvatel: MaSo_CZ 20 Srpna 2012, 00:39:32
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)
Název: Re:Python /dev/ttyUSB0
Přispěvatel: YaD 20 Srpna 2012, 10:23:32
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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: Myrmica 20 Srpna 2012, 13:43:15
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.
Název: Re:Python /dev/ttyUSB0
Přispěvatel: omorok 29 Října 2012, 20:54:14
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:
Citace
#!/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
Název: Re:Python /dev/ttyUSB0
Přispěvatel: MaSo_CZ 29 Října 2012, 21:18:42
tak s rozhozením sloupců do proměnných je too easy pomoci příkazu awk:

Kód: [Vybrat]
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)