[python] pyserial -- čtení a zápis
Vlastimil Slintak
vasco.vls na gmail.com
Čtvrtek Březen 1 11:22:50 CET 2012
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.
Další informace o konferenci Python