Seite 1 von 1

#1 LCN-PC unter Linux ansteuern

Verfasst: So 5. Dez 2004, 00:31
von KeineInfo
Hallo zusammen,
ich bin dabei erste Versuch zu unternehmen mit Linux LCN-PC anzusteuern.
Dabei nutze ich das unten angehängte Programm in der Form
./lcn 80 05 84 00 14 04 32 00
um am Modul 20 Ausgang 1 einzuschalten.

Leider wird das Kommando nicht immer angenommen und funktioniert manchmal nur bei wiederholungen.
Hat jemand Erfahrungen mit Linux den LCN-PC anzusteuern?
Kennt sich jemand mit der Ansteuerung der seriellen Schnittstelle unter Linux aus? Das Programm unten ist nur ein erster Versuch.
Was muss man außerdem bei der Ansteuerung des LCN-PC beachten.
Beste Grüße

#include
#include
#include /* Standard input/output definitions */
#include /* String function definitions */
#include /* UNIX standard function definitions */
#include /* File control definitions */
#include /* Error number definitions */
#include /* POSIX terminal control definitions */
#include /* conversions */

/*
* user must have read/exec/write permission on port
*/


#define PORT "/dev/ttyS0"

typedef unsigned char uchar;

int sndcmd(uchar *list, int fd) {


/* Sending 80 */
/* 05 Info byte */
/* Checksum byte */
/* Target segment ID byte (without segments 0) */
/* Target module/group ID */
/* Command byte 05 Ausgang 2 */
/* Subcommand byte 32 Ein */
/* Data byte 00 Rampe 0 */
int count;
printf ("sending -> ");
for (count = 0; count < 8;count++) {
printf ("%0.2x ", list[count]);
}
printf ("\n");
printf ("Sending to segment:module/group ID : %d:%d\n", list[3],list[4] );
switch (list[5]) {
case 0x04 : printf ("Pin 1 \n");
break;
case 0x05 : printf ("Pin 2 \n");
break;
default : printf ("??\n");
}

switch (list[6]) {
case 0x32 : printf ("On \n");
break;
case 0x00 : printf ("Off \n");
break;
default : printf ("Don"t know what command\n");
}

printf ("Ramp %d\n",list [7]);

if (write(fd, list, 8))
return 1;
else
return -1;

}

int main(int argc, char *argv[])
{

if (argc != 9 )
{
printf ("Usage: %s + 8 hexadecimal arguments\n",argv[0]);
exit(1);
}

uchar h;
int i;
int count;

uchar list[8];

for (count = 1; count < argc;count++) {
i = sscanf (argv[count],"%x",&list[count-1]);
}

int fd; /* File descriptor for the port */

fd = open(PORT, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd == -1)
{
/*
* Could not open the port.
*/

perror("open_port: Unable to open /dev/ttyS?");

} else {

fcntl(fd, F_SETFL, 0);

struct termios options;

/* get the current options */
tcgetattr(fd, &options);

/* set in and out speed */
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

options.c_cflag &= ~PARENB; /* No parity generation */
options.c_cflag &= ~CSTOPB; /* 1 stop bit */
options.c_cflag &= ~CSIZE; /* Clear size bits */
options.c_cflag |= CS8; /* Select 8 data bits */
options.c_cflag |= CRTSCTS; /* Enable RTS/CTS (hardware) flow con­
trol. */

/* set raw input, 1 second timeout */
options.c_cflag |= (CLOCAL); /* local connection, no modem contol */
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;

/* set the options */
tcsetattr(fd, TCSAFLUSH, &options);

sndcmd(list,fd);

}

close(fd);
return 1;
}

#2 RE: LCN-PC unter Linux ansteuern

Verfasst: Mi 8. Dez 2004, 23:19
von KeineInfo
Hallo zusammen,
ich habe das Programm weiter untersucht.
Bisher bekomme ich es nur mit Linux Kernl 2.6 zum Laufen.
Mit Kernel 2.4 geht es noch nicht.
Die Verlässlichkeit konnte ich steigern. Ein wenig sleep reicht.
Warum müsste noch herausgefunden werden
Wenn Interesse besteht, dann poste ich den aktualisierten Code gerne.
Evtl. auf gnulcn.sf.net? Inkl. Makefile
Damit bliebe nur noch die Frage offen, wie man die Checksums berechnet (;-)
Beste Grüße