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!

Autor Téma: Python /dev/ttyUSB0  (Přečteno 5259 krát)

omorok

  • Návštěvník
  • Příspěvků: 40
Python /dev/ttyUSB0
« kdy: 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
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

YaD

  • Návštěvník
  • Příspěvků: 69
Re:Python /dev/ttyUSB0
« Odpověď #1 kdy: 08 Srpna 2012, 01:44:11 »
Na čítanie ti bude stačiť open, na dekódovanie struct a na konkurenčné spracovanie odporúčam multiprocessing, 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).
« Poslední změna: 08 Srpna 2012, 02:16:37 od YaD »

omorok

  • Návštěvník
  • Příspěvků: 40
Re:Python /dev/ttyUSB0
« Odpověď #2 kdy: 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...
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

YaD

  • Návštěvník
  • Příspěvků: 69
Re:Python /dev/ttyUSB0
« Odpověď #3 kdy: 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á.

starenka

  • Stálý člen
  • **
  • Příspěvků: 1276
  • Karma: plynová [zapalovač] [hasičák]
    • /home/starenka
Re:Python /dev/ttyUSB0
« Odpověď #4 kdy: 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
mojenka | blozinek v2 | starej blozinek | krotim hady za penize | UJ! Kalužátor

Debian testing vrní v Thinkpadu X200/bedně/EEE 900a, MasoX Tiger v lampe

omorok

  • Návštěvník
  • Příspěvků: 40
Re:Python /dev/ttyUSB0
« Odpověď #5 kdy: 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
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

YaD

  • Návštěvník
  • Příspěvků: 69
Re:Python /dev/ttyUSB0
« Odpověď #6 kdy: 14 Srpna 2012, 17:58:13 »

omorok

  • Návštěvník
  • Příspěvků: 40
Re:Python /dev/ttyUSB0
« Odpověď #7 kdy: 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
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

YaD

  • Návštěvník
  • Příspěvků: 69
Re:Python /dev/ttyUSB0
« Odpověď #8 kdy: 14 Srpna 2012, 23:22:37 »
Zabudol som tam rovná sa, sorry. Už by to malo ísť.

omorok

  • Návštěvník
  • Příspěvků: 40
Re:Python /dev/ttyUSB0
« Odpověď #9 kdy: 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
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

starenka

  • Stálý člen
  • **
  • Příspěvků: 1276
  • Karma: plynová [zapalovač] [hasičák]
    • /home/starenka
Re:Python /dev/ttyUSB0
« Odpověď #10 kdy: 18 Srpna 2012, 22:28:56 »
Raspberry Pi, BeagleBone...
mojenka | blozinek v2 | starej blozinek | krotim hady za penize | UJ! Kalužátor

Debian testing vrní v Thinkpadu X200/bedně/EEE 900a, MasoX Tiger v lampe

MaSo_CZ

  • Návštěvník
  • Příspěvků: 54
Re:Python /dev/ttyUSB0
« Odpověď #11 kdy: 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/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
desktop: AMD FX-8120 & CRUCIAL 8GB (kit 2x 4GB) Ballistix Tactical 1866MHz @ ASUS M5A88-V EVO: Ubuntu 12.04/64b
server:    AMD Duron@1400MHz: Debian v6

YaD

  • Návštěvník
  • Příspěvků: 69
Re:Python /dev/ttyUSB0
« Odpověď #12 kdy: 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

Myrmica

  • Závislák
  • ***
  • Příspěvků: 1701
    • MYRMICA
Re:Python /dev/ttyUSB0
« Odpověď #13 kdy: 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.
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

omorok

  • Návštěvník
  • Příspěvků: 40
Re:Python /dev/ttyUSB0
« Odpověď #14 kdy: 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
Processor – Intel Pentium IV (2,80 GHz), OS– LinuxMint 13
Chipset – Asustek P4P800-E , 1 GB of RAM DDR (400 MHz)
Graphics –  NVIDIA GeForce FX 5700)

MaSo_CZ

  • Návštěvník
  • Příspěvků: 54
Re:Python /dev/ttyUSB0
« Odpověď #15 kdy: 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)
desktop: AMD FX-8120 & CRUCIAL 8GB (kit 2x 4GB) Ballistix Tactical 1866MHz @ ASUS M5A88-V EVO: Ubuntu 12.04/64b
server:    AMD Duron@1400MHz: Debian v6

 

Provoz zaštiťuje spolek OpenAlt.