Willkommen auf unserer neuen Forenplattform für das Bus-Profi Forum

Neue Felder für die persönlichen Daten
Man kann jetzt seine öffentlich einsehbare Daten genau bestimmen. Details findet ihr in in diesem Beitrag.

Durch die neue Forensoftware und die Portierung der Daten konnten die Passwörter aus dem alten Forum nicht übernommen werden, bitte lassen Sie sich ein neues Passwort über die Passwort vergessen Funktion zusenden. Sollte es zu Problemen kommen kontaktieren Sie das Bus-Profi Team per E-Mail.

LCN-PC unter Linux ansteuern


Themenersteller
KeineInfo
Lord Forum
Lord Forum
Beiträge: 1846
Registriert: Fr 11. Mär 2016, 23:24

#1 LCN-PC unter Linux ansteuern

Beitragvon KeineInfo » 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;
}


Themenersteller
KeineInfo
Lord Forum
Lord Forum
Beiträge: 1846
Registriert: Fr 11. Mär 2016, 23:24

#2 RE: LCN-PC unter Linux ansteuern

Beitragvon KeineInfo » Mi 8. Dez 2004, 23:19

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


Zurück zu „Eigenproduktionen SW“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste