LED-Namensschild

From NoName e.V.
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Programm von ralf/entropia


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <fcntl.h>
#define __USE_BSD
#include <unistd.h>
#include <termios.h>

#define DEBUG_LEVEL 6

static int fd = 0;

int init_bl(void);
int command_bl(char*, char);


int main(int argc, char *argv[])
{
	init_bl();
	command_bl(argv[2], argv[1][0]);
	return (0);			
}
 
/* Funktion zum Initialisieren und öffnen des Ports/Devices */
int init_bl (void)
{ 
  int modelines = 0;
  struct termios settings;

  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: gestartet.\n");

  /* öffnen und überprüfen des Filedeskriptors */
  fd = open ("/dev/ttyUSB0", O_RDWR|O_NOCTTY);
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Filedeskriptor fuer Device tty* ist %d.\n", fd);
  if (fd == -1) return (fd);
 
  /* Prüfen ob Filedeskriptor zu einem Terminal gehört */
  if (!isatty(fd))
  {
     fprintf (stderr,"Das Device ist kein Terminal-Device.\n");
     return (-1);
  }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: Device %d ist ein Terminaldevice.\n", fd);
  
  /* Setzen der Inputflags */
  /* Ignoriere BREAKS beim Input /  Keine Parität / Software-Handschake aus */
  settings.c_iflag = IGNBRK | IGNPAR | IXOFF;    

  /* Setzen der Outputflags */
  settings.c_oflag = 0;         /* Keine besonderen Angaben nötig */

  /* Setzen der Controlflags */
  /* Setze acht Bit / Lesen erlauben / Ignoriere Modembefehle */
  settings.c_cflag =   CS8 | CREAD | CLOCAL; 

  /* Setzen der lokalen Flags */
  settings.c_lflag = 0;         /* Keine besonderen Angaben nötig */  

  /* Festlegen der maximalen Zeit, welche beim Lesen gewartet werden soll */
  settings.c_cc[VTIME] = 10;    /* Angabe in Zehntel-Sekunden */

  /* Festlegen der minimalen Anzahl der zu lesenden Bytes */
  settings.c_cc[VMIN] = 0;
 
  /* Definieren der übertragungsgeschwindigkeit */
  if(cfsetspeed (&settings, B1200) != 0) {
     fprintf (stderr,
        "Fehler beim Setzen der Übertragungsgeschwindigkeit auf 19200 !\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Baudrate 1200 fuer Device %d gesetzt.\n", fd);
  
  /* übertragung der Einstellungen an die Schnittstelle */
  if (tcsetattr (fd, TCSANOW, &settings) == -1) {
     fprintf (stderr,"Fehler beim Setzen der Terminalattribute fuer Device.\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Schnittstellenparameter fuer Device %d gesetzt.\n", fd);

  /* Lesen der IO-Control-Parameter */
  if (ioctl (fd, TIOCMGET, &modelines) == -1) {
     fprintf (stderr,"Fehler bei ioctl TIOCMGET fuer Device.\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: IO-controlparameter fuer %d gelesen.\n", fd);

  /* Setzen des RTS-Signals */
  modelines &= ~TIOCM_RTS;
  if (ioctl (fd, TIOCMSET, &modelines) == -1) {
     fprintf (stderr,"Fehler bei ioctl TIOCMSET fuer Device.\n"); 
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: RTS-Signal fuer %d gesetzt.\n", fd);
  
   return (fd);
}

int command_bl (char* befehl, char v)
{

  int  i, len, nbyte,j=2;
  char buf[160];

  buf[0] = 2;
  buf[1] = v;

  len = strlen(befehl);
  if (len > 120) {
      fprintf(stderr,"command_bl: Uebergabestring zu lang (%d). \n", len);
      return (-1);
  }

  /* Kopieren des Befehls in den Puffer */ 
  for (i = 0; i < len; i++) buf[j++] = befehl[i];
  buf[j++] = 3; 

  len += 3;

  if (DEBUG_LEVEL > 3 )
     fprintf (stderr, "command_bl: -> BL (%d): %s  \n", len, buf);
  
  nbyte = write (fd, buf, len);
  if (nbyte != len) {
         fprintf (stderr,"command_bl: Schreibfehler. %d Zeichen uebertragen. \n", nbyte);
         if (DEBUG_LEVEL < 5) return (-1);
  }

  return (-1);
}

AENDERUNGEN VON JCHOME


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>

#define DEBUG_LEVEL 6

static int fd = 0;

int init_bl(char*);
int command_bl(char*, char);


int main(int argc, char *argv[])
{
  if(argc<3){
    printf("usage: %s speed text [device]\n%s 2 \"this is a text\" /dev/ttyUSB0\n",argv[0],argv[0]);
    return 0;
  }
  init_bl(argv[3]);
  command_bl(argv[2], argv[1][0]);
  return 0;     
}
 
/* Funktion zum Initialisieren und öffnen des Ports/Devices */
int init_bl (char *device)
{ 
  int modelines = 0;
  struct termios settings;

  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: gestartet.\n");

  /* öffnen und überprüfen des Filedeskriptors */
  if(device)
    fd = open(device, O_RDWR|O_NOCTTY);
  else
    fd = open ("/dev/ttyUSB0", O_RDWR|O_NOCTTY);
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Filedeskriptor fuer Device tty* ist %d.\n", fd);
  if (fd == -1) return (fd);
 
  /* Prüfen ob Filedeskriptor zu einem Terminal gehört */
  if (!isatty(fd))
  {
     fprintf (stderr,"Das Device ist kein Terminal-Device.\n");
     return (-1);
  }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: Device %d ist ein Terminaldevice.\n", fd);
  
  /* Setzen der Inputflags */
  /* Ignoriere BREAKS beim Input /  Keine Parität / Software-Handschake aus */
  settings.c_iflag = IGNBRK | IGNPAR | IXOFF;    

  /* Setzen der Outputflags */
  settings.c_oflag = 0;         /* Keine besonderen Angaben nötig */

  /* Setzen der Controlflags */
  /* Setze acht Bit / Lesen erlauben / Ignoriere Modembefehle */
  settings.c_cflag =   CS8 | CREAD | CLOCAL; 

  /* Setzen der lokalen Flags */
  settings.c_lflag = 0;         /* Keine besonderen Angaben nötig */  

  /* Festlegen der maximalen Zeit, welche beim Lesen gewartet werden soll */
  settings.c_cc[VTIME] = 10;    /* Angabe in Zehntel-Sekunden */

  /* Festlegen der minimalen Anzahl der zu lesenden Bytes */
  settings.c_cc[VMIN] = 0;
 
  /* Definieren der übertragungsgeschwindigkeit */
  if(cfsetspeed (&settings, B1200) != 0) {
     fprintf (stderr,
        "Fehler beim Setzen der Übertragungsgeschwindigkeit auf 19200 !\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Baudrate 1200 fuer Device %d gesetzt.\n", fd);
  
  /* übertragung der Einstellungen an die Schnittstelle */
  if (tcsetattr (fd, TCSANOW, &settings) == -1) {
     fprintf (stderr,"Fehler beim Setzen der Terminalattribute fuer Device.\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr, "init_bl: Schnittstellenparameter fuer Device %d gesetzt.\n", fd);

  /* Lesen der IO-Control-Parameter */
  if (ioctl (fd, TIOCMGET, &modelines) == -1) {
     fprintf (stderr,"Fehler bei ioctl TIOCMGET fuer Device.\n");
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: IO-controlparameter fuer %d gelesen.\n", fd);

  /* Setzen des RTS-Signals */
  modelines &= ~TIOCM_RTS;
  if (ioctl (fd, TIOCMSET, &modelines) == -1) {
     fprintf (stderr,"Fehler bei ioctl TIOCMSET fuer Device.\n"); 
     return (-1);
   }
  if (DEBUG_LEVEL > 5) fprintf (stderr,"init_bl: RTS-Signal fuer %d gesetzt.\n", fd);
  
   return (fd);
}

int command_bl (char* befehl, char v)
{

  int  i, len, nbyte,j=2;
  char buf[160];

  buf[0] = 2;
  buf[1] = v;

  len = strlen(befehl);
  if (len > 120) {
      fprintf(stderr,"command_bl: Uebergabestring zu lang (%d). \n", len);
      return (-1);
  }

  /* Kopieren des Befehls in den Puffer */ 
  for (i = 0; i < len; i++){
    befehl[i]=toupper(befehl[i]); 
    buf[j++] = befehl[i];
  }
  buf[j++] = 3; 
  buf[j] = '\0';
  len += 3;

  if (DEBUG_LEVEL > 3 )
     fprintf (stderr, "command_bl: -> BL (%d): %s  \n", len, buf);
  
  nbyte = write (fd, buf, len);
  if (nbyte != len) {
         fprintf (stderr,"command_bl: Schreibfehler. %d Zeichen uebertragen. \n", nbyte);
         if (DEBUG_LEVEL < 5) return (-1);
  }

  return (-1);
}