Permalänk

Python: Events för pySerial?

Tjena,

Jobbar på ett Python program som kommunicerar med en PIC via seriell porten på datorn.
Till det så använder jag pySerial för kommunikationen, och allt fungerar som det ska, såhär ser den aktuella kod-snutten ut:

self._port.setRTS( self._RAISE ) While True: if self._port._getDSR( ) == self._LOWER: break self._port.setRTS( self._LOWER ) result = self._port.read( self._port.inWaiting( ) )

PIC'en är gjord så att man efterfrågar data genom att höja RTS-pinnen... den höjer då DSR och skickar all data. sedan sänker den DSR när all data är skickad.
Med ovan kod så fungerar kommunikationen som den ska. Men det jag tycker känns "fel" är att använda en loop för att kolla det. Finns det inget bättre sätt att invänta DSR än så? I Java ställer man ju bara in ett Event på att trigga när den ändras. Förmodligen kommer jag försöka lägga koden i en egen tråd ändå, men borde inte denna kod typ låsa hela programmet alt. belasta processorn mer än nödvändigt?

Är t.ex. detta ett något bättre alternativ för att sänka ev. belastning?

import time ... While self._port.getDSR( ) != self._LOWER: time.sleep(0.01)

Har ingen erfarenhet av denna typen av programmering annat än i Java (där jag skrev första test-programmet för detta projekt). Hur brukar man göra!?

OS: Linux, debian lenny
Python: 2.6
pySerial 2.5

Permalänk
Medlem
Skrivet av Användarnamnqwer:

Är t.ex. detta ett något bättre alternativ för att sänka ev. belastning?

import time ... While self._port.getDSR( ) != self._LOWER: time.sleep(0.01)

Har ingen erfarenhet av denna typen av programmering annat än i Java (där jag skrev första test-programmet för detta projekt). Hur brukar man göra!?

Att anropa sleep fungerar för att sänka belastningen. En annan möjlighet som kan fungera är att använda select. Istället för att kontinuerligt fråga om något hänt, anropar du istället select en gång och väntar tills något hänt. Det jag inte vet är om denna metod fungerar just för att få reda på när DSR ändras; den används i allmänhet snarare för att se när man fått ny data, men det är ju egentligen det du är ute efter, så kanske fungerar det annars ur den synvinkeln. Du kan prova om det fungerar i ditt fall.

port_publisher.py är ett exempel där select används. I exemplet implementeras ett eget callback-system vid händelser.

Visa signatur

Vill du ha svar? Citera mig gärna.