Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo! > > Ich habe hier das I2c-PC-Interface aus dem cctools-Shop. Das funktioniert ganz prächtig unter Windows > mit dem Comm-Control unter VisualBasic. Da mein Serverchen, der das Ding bekommen soll, aber > unter Linux läuft, dachte ich mir: Schreib ich einfach mal in C nach. Also habe ich folgendes geschrieben: > <pre> > #include <unistd.h> > #include <sys/ioctl.h> > #include <termios.h> > #include <fcntl.h> > > > #define true -1 > #define false 0 > > #define DELAY 0.0001 > > > int fd=0; //Dateihandle > int status=0; //Für ioctl > > > unsigned char dtr(unsigned char state) { > status=0; > ioctl(fd, TIOCMGET, &status); > if (state!=0) > status &= TIOCM_DTR; > else > status &= ~TIOCM_DTR; > > ioctl(fd, TIOCMGET, &status); > //wait(DELAY); > } > > unsigned char rts(unsigned char state) { > status=0; > ioctl(fd, TIOCMGET, &status); > if (state!=0) > status &= TIOCM_RTS; > else > status &= ~TIOCM_RTS; > > ioctl(fd, TIOCMGET, &status); > //wait(DELAY); > } > > unsigned char cts() { > ioctl(fd, TIOCMGET, &status); > //wait(DELAY); > if ((status & TIOCM_CTS) > 0) > return -1; > else > return 0; > } > > unsigned char send(unsigned char data) { > unsigned char result; > > rts(data & 0x80); > dtr(true); > dtr(false); > > rts(data & 0x40); > dtr(true); > dtr(false); > > rts(data & 0x20); > dtr(true); > dtr(false); > > rts(data & 0x10); > dtr(true); > dtr(false); > > rts(data & 0x8); > dtr(true); > dtr(false); > > rts(data & 0x4); > dtr(true); > dtr(false); > > rts(data & 0x2); > dtr(true); > dtr(false); > > rts(data & 0x1); > dtr(true); > dtr(false); > > rts(true); > dtr(true); > result=~cts(); > dtr(false); > > return result; > } > > <div color=grey>/* > int receive(int ackn) { > int result=0; > > rts(true); > dtr(true); > if (cts()) result=128; > dtr(false); > > dtr(true); > if (cts()) result+=64; > dtr(false); > > dtr(true); > if (cts()) result+=32; > dtr(false); > > dtr(true); > if (cts()) result+=16; > dtr(false); > > dtr(true); > if (cts()) result+=8; > dtr(false); > > dtr(true); > if (cts()) result+=4; > dtr(false); > > dtr(true); > if (cts()) result+=2; > dtr(false); > > dtr(true); > if (cts()) result+=1; > dtr(false); > > rts(ackn); > dtr(true); > dtr(false); > > return result; > } > */</div> > > unsigned char i2c_start(unsigned char addr) { > dtr(true); > rts(true); > rts(false); > dtr(false); > rts(true); > return send(addr); > } > > unsigned char i2c_stop() { > rts(false); > dtr(true); > rts(true); > } > > unsigned char setpcf(unsigned char addr, unsigned char state) { > i2c_start(addr); > send(state); > i2c_stop(); > } > > > int main(int argc, char** argv) { > unsigned addr; > unsigned state; > > if (argc != 3) { > printf("Falsche Parameterzahl\nSyntax:\n %s addr state\n", argv[0]); > return 1; > } > > if ((fd=open("/dev/ttyS0", O_RDWR)) < 0) { > printf("Fehler beim Oeffnen der Schnittstelle...\n"); > return 1; > } > > sscanf(argv[1],"%d",&addr); > sscanf(argv[2],"%d",&state); > > addr=addr*2+64; > > printf("Verwende Adresse %d...\n", addr); > > setpcf(addr,state); > > > close(fd); > } > </pre> > > Dann rufe ich das ganze so wie's gedacht ist mit ./a.out 6 255 bzw. ./a.out 6 0 auf, um alle Relais auf > der Relaisplatine (Adresse 6=64+2*6=76) stimmt. Die receive-Funktion habe ich mal auskommentiert, > die brauche ich ja hierfür nicht. Was mache ich falsch? Muss ich da evtl. noch warten, weil's zu schnell > läuft oder was? > > Mit freundlichen Grüßen, > > Christoph