#1 LCN-PC unter Linux ansteuern
Verfasst: So 5. Dez 2004, 00:31
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;
}
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;
}