#!/usr/bin/python # coding: utf-8 import smbus import time import argparse # Definition des zu nutzenden I2C Buses. Im Raspberry Pi Rev. 2 ist dies 1. BUS = smbus.SMBus(1) # Code adaptiert nach: # http://elinux.org/RPi_Tutorial_EGHS:Communicating_With_Other_Micro-controllers def StringToBytes(val): retVal = [] for c in val: retVal.append(ord(c)) return retVal def i2csend(val,addr,d): # Da wir auf die globale Variable schreiben werden, muss sie in der Funktion initialisiert werden. global BUS # Abtrennen des ersten Zeichens als "cmd", da das I2C Protokoll dies vorsieht und an der Gegenstelle nicht implementiert ist. FirstChar = val[0] FirstCharInt = [] if d == True: print FirstChar FirstCharInt.append(ord(FirstChar)) if d == True: print FirstCharInt # Sollte mehr als ein Zeichen gesendet werden, müssen die restlichen Zeichen in ein Byte-Array gewandelt werden. if len(val) > 1: RestChars = val[1:] if d == True: print RestChars messageInBytes = StringToBytes(RestChars) if d == True: print messageInBytes # Ansonsten bleibt dieses Array leer. else: messageInBytes = [] # Schreiben der (aufgesplitteten) Nachricht an das Gerät 'addr' am Bus BUS. BUS.write_i2c_block_data(addr, FirstCharInt[0], messageInBytes) if d == True: print "sent:" sent = FirstCharInt + messageInBytes print sent def i2cread(addr): # Lesen vom Gerät 'addr' am Bus Bus. Das Zeichen 0xFF wird vorausgeschickt. return BUS.read_i2c_block_data(addr,0xFF) def main(): # Deklarieren der Kommandozeilenoptionen parser = argparse.ArgumentParser(prog='if_i2c',description='Interface to send or receive I2C Bus messages.') parser.add_argument('-v', '--version', action='version', version='%(prog)s 0.0.1') parser.add_argument('-d','--debug',help='prints debug output',action='store_true',default=False) parser.add_argument('-r','--read',help='read from I2C device',action='store_true',default=False) parser.add_argument('-s','--send',help='a string to be sent') parser.add_argument('-a','--addr',help='I2C address of target device',type=int,default=0x42) # Sollte keine Kommandozeilenoption angegeben sein, zeige Hilfe. if len(sys.argv)==1: parser.print_help() sys.exit(1) args = parser.parse_args() if args.debug == True: print args if args.send is not None: print "...senden..." i2csend(args.send,args.addr,args.debug) if args.debug == True: time.sleep(3) if args.read == True: print "...lesen..." gelesen = i2cread(args.addr) print gelesen if __name__ == "__main__": import sys main()