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: 
 
#include  
#include  
#include  
#include  
 
 
#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; 
} 
 
/* 
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; 
} 
*/  
 
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 ParameterzahlnSyntax:n  %s addr staten", 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); 
} 
  
 
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
 
  |