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
|