Vydání 13.04, 12.10, 12.04 > Programování pro GNU/Linux
Python /dev/ttyUSB0
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