[python] pyserial -- čtení a zápis

rajcze rajcze na gmail.com
Čtvrtek Březen 1 11:43:18 CET 2012


K reseni "nevim kolik znaku mam precist" se neda pouzit nic jineho
(pokud vim), nez ze mas nejaky definovay protokol - treba STX/ETX.
Jinak to vyresit snad ani nejde. Z ryze praktickeho pohledu bud vim,
kolik toho mam precist, a pak cekam nez to dostanu, nebo to nevim, a
pak mam bud kontrolni mechanismy, ktere mi rikaji "uz konec", nebo se
musim spolehnout na to, ze kdyz "nejaky cas neco nedostanu, tak uz tam
nic neni" (coz je asi nejhorsi varianta).

Nevim, co presne na ty atmeze mas za program, ale pokud je to neco
vlastniho, tak doporucuju zavedeni nejakyho protokolu ;)

Jinak neprecteny data zustavaj (typicky) v bufferu dokud si je
neprectes, nebo se buffer nepreplni.

2012/3/1 Vlastimil Slintak <vasco.vls na gmail.com>:
> Zdravím,
>
> poslední dva dny se trápím s komunikací přes sériovou linku a knihovnou pyserial a nemůžu se hnout z místa.
>
> Abych byl konkrétní -- mám desku s mikrokontrolérem ATMega8U2, který se skrze USB hlásí jako sériová linka (na Mac OS je to /dev/tty.usbmodem441) a chci do tohoto zařízení zapisovat i číst. Po připojení desky s ní mohu normálně komunikovat, např.:
>
>  import serial
>
>  s = serial.Serial('/dev/tty.usbmodem441', 57600, timeout=1)
>
>  s.write('R')
>  print s.read(size=6)
>
>  s.write('S')
>  print s.read(size=50)
>
> Problém je ten, že občas ze zařízení přečtu přesně to, co očekávám, občas ne, občas přečtu jen půlku. Zkoušel jsem různě nastavit 'timeout', ale bez úspěchu. Zkoušel jsem i něco takového:
>
>  s.write('R')
>  print s.read(size=s.inWaiting())
>
> a
>
>  s.write('R)
>  while s.inWaiting():
>    print.s.read()
>
> ale zdá se, že funkce s.inWaiting() nevrací správné hodnoty, nebo se chová jinak než si myslím. Také jsem zkoušel mezi zápis a čtení vložit  sleep():
>
>  s.write('R')
>  time.sleep(1)
>  print s.read(size=6)
>
> Chci se tedy zeptat -- jaký je korektní způsob zápisu a čtení ze sériové linky, když předem nevím, kolik znaků mám přečíst? Je nějaký způsob, jak to zjistit? A co se stane, když do zařízení pouze zapíšu, ale již nepřečtu? Ztratí se přijatá data, nebo zůstanou někde v bufferu?
>
> Díky,
> V.S.
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python



-- 
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.


Další informace o konferenci Python