De reden dat ik tot nu toe nog niet begonnen was met Python, komt omdat ik direct ook een nuttig programma wil schrijven en dan wel zie wat ik tegen kom. Op de eéń of andere manier kan ik me niet motiveren om 'stomme' oefeneningen te doen. Pas bedacht ik me dat Python misschien wel nuttig gebruikt kon worden voor m'n werk. Op m'n werk hebben de producten namelijk eigenlijk bijna allemaal elektronica aan boord. Ook hebben enkele producten een RS232 uitgang waarmee er met de computer gecommuniceerd kan worden. De combinatie van Python en RS232 leek me wel een leuke om mee te beginnen. Na wat gegrasduin (staat dit in de van Dale?) vond ik een bibliotheek voor het communiceren over de seriële poort. Deze bibliotheek zit ook al in Ubuntu, dus die was zo geïnstalleerd (even in Synaptic zoeken met zoekterm Python serial). Voor het programmeren zou het echter wel handig zijn om de data die beide richtingen door de seriële poort gaat te kunnen monitoren. Je kunt dan makkelijker zien of er iets mis gaat. Na veel zoeken vond ik op het Internet het programma Interceptty. Deze was helaas niet in een Deb verkrijgbaar, dus moest ik deze zelf compileren. *ahum* Ik ben niet zo goed in het compileren van software in Linux. Dit loopt bij mij meestal uit in een berg errors. Deze keer ging het echter van een leien dakje. Toen begon echter het probleem. Met welk commando start je nu interceptty zodat deze het dataverkeer van en naar de seriële poort monitoort? De voorbeelden die in het readme-bestand worden gegeven zijn niet van toepassing op mijn situatie en ik snapte ook niet goed hoe ik de parameters moest toepassen. Gelukkig kwam ik er uit na een dagje experimenteren, een nachtje slapen en weer opnieuw proberen:). Je moet namelijk het onderstaande commando gebruiken:
sudo ./interceptty -s 'ispeed 9600 ospeed 9600' /dev/ttyS0 /dev/serieel
Een beetje uitleg bij deze cryptische regel...
- De snelheid waarmee gecommuniceerd wordt, wordt weergeven achter
ispeeds
enospeed
, waarbijispeeds
de ingaande snelheid is enospeeds
de uitgaande snelheid. In mij geval is de snelheid dus 9600 baud. - Mijn stukje hardware hangt aan de eerste (enige) seriële poort van de computer. De code hiervoor is
/dev/ttyS0
. - Je moet ook een 'poort' opgeven voor de software kant. Dit is een andere poort dan de seriële poort van de computer in. Het programmaatje zit als het ware tussen de fysieke seriële poort en je programma op de computer in. Daarom definiëren we voor de computerkant een softwarematige poort. Deze heb ik
/dev/serieel
genoemd, maar je mag zelf iets kiezen, dus/dev/eenhelelangepoortnaam
is ook goed, maar niet zo bruikbaar.
import serial
s = serial.Serial('/dev/serieel',9600,timeout=1)
Als je nu een commando naar de seriële poort schrijft zie je die in het terminal venster weer. Als je bijvoorbeeld onderstaande commando in python schrijft:
s.write('hoi')
dan zie je in het terminal venster het volgende verschijnen...
< 0x68 (h)
< 0x6f (o)
< 0x69 (i)
Als de hardware die aan de seriële poort dit nu begreep kreeg je een antwoordt. Aangezien ik geen hardware ken die dit commando kent gebeurt er niets. Als ik nu mijn stuk hardware neem en daar het volgende commando heen stuur
s.write("\x07\xf0\x00\x0f\x00\xbc\x07\x0f")
dan zie ik het volgende...
< 0x07
< 0xf0
< 0x00
< 0x0f
< 0x00
< 0xbc
< 0x07
< 0x0f
> 0x07
> 0xf3
> 0x07
> 0xf0
> 0x00
> 0x10
> 0x04
> 0x5b ([)
> 0x28 (()
> 0x28 (()
> 0x5b ([)
> 0xc7
> 0x07
> 0x0f
Alle regels die beginnen met
<
worden de seriële poort uitgestuurd (mijn commando dus). Alle regels die beginnen met >
komen terug van de hardware die aan de seriële poort hangt. Mijn commandoregel ziet er een beetje raar uit. Maar als ik je vertel dat '\x07
staat voor een hexadecimale 7 dan begrijp je het misschien een beetje. Het is leuk dat er een commando terug komt, maar nu moet ik nog een programmaatje schrijven dat iets nuttigs doet. Hard aan het werk dus:)
2 opmerkingen:
Cool :) Hou me op de hoogte ;) dit vind ik wel interessant, mede omdat ik ook geprobeerd heb om een programma te schrijven dat iets deed over een virtuele seriële poort (hardware device dat een serial2usb chip gebruikt) - maar is me nooit gelukt :)
Hoi Wesley,
Seriële interface via USB... Volgens mij is dat nog een slag moeilijker, omdat er meerdere apparaten over USB kunnen praten, omdat het een bus is. Het programmaatje wat ik nu probeer te schrijven kan ik je helaas niet zomaar geven, want ik weet niet of ze het op het werk zo'n goed idee vinden dat het protocol van de hardware bekend wordt. Zelf heb ik er geen problemen mee, maar om problemen te voorkomen :D
Een reactie posten