[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