Vydání 13.04, 12.10, 12.04 > Programování pro GNU/Linux

Python /dev/ttyUSB0

(1/4) > >>

omorok:
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

YaD:
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: ---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)

--- Konec kódu ---


--- Kód: --->i
--- Konec kódu ---
Je v struct je 32 bitové číslo so znamienkom vo formáte big-endian

--- Kód: --->
--- Konec kódu ---
je big-endian, pre little-endian je <

--- Kód: ---i
--- Konec kódu ---
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).

omorok:
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

--- Konce citace ---

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()
--- Konce citace ---

Děkuji za pomoc...

YaD:
Ja som tam neimportoval tie moduly, sorry.

Ak nechceš čítať dáta len ako admin, tak musíš upraviť práva:

--- Kód: ---$ sudo chmod 644 /dev/ttyUSB0
--- Konec kódu ---
Len pre čítanie a...

--- Kód: ---$ sudo chmod 666 /dev/ttyUSB0
--- Konec kódu ---
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á.

starenka:
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

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi