API programmieren

T

thomaland26

Grünschnabel
hello,
ich habe ein einfaches programm in C gechrieben um daten senden und empfangen vom peripheriegerät uber RS232. jetzt möchte ich ein API schreiben. es soll so funktionieren, wenn das gerät angeschlossen wird, muss automatisch ein fenster(editor, comand) öffnen, wo ich daten eingeben kann und daten vom gerät angezeigt wird. ich bin anfänger mit linux und C.kann jemand mir helfen? gibt es richtige bücher für API programmierung oder welche quellen wo man richtige information finden kann?

System: Linux
Programm: C
Serielport: RS232

Danke
mfg
Thoma
 
Ich habe kürzlich eine Klasse in C++ geschrieben um ein Display am seriellen Port anzusprechen; Sowas könntest du für dich da auch schreiben.
Mit dem Plug&Play ist das meines Wissens schon schwieriger - dafür müsstest du einen daemon haben der überprüft ob an dem Port was angeschlossen ist, da von dem Port kein Event ausgeht wenn was angeschlossen wird.

MfG
Psyjo
 
Api

moin,
was ist ein dämon? ist das auch ein programm?

mfg
thoma
 
Auf deutsch heist sowas auch Dienst, ein Programm das im Hintergrund läuft, und in dem Fall immer überprüft ob da was am COM angeschlossen ist.
 
API Programierung

moin
Diese dämon muss ich auch selbst schreiben oder gibt es schon fertig zum herunterladen?
mfg
thoma
 
Ich bin mir jetzt gar nicht sicher, ob die serielle schnittstelle plug & play fähig ist, aber wenn ja sollte das mit udev funktionieren, du musst dir nur noch eine rule schreiben und alles sollte in butter sein.

Bin mit bei den Einzelheiten jetzt auch nicht sicher, aber du findest sicher einiges dazu
 
hello,
kann jemand helfen ein init programm unter linux zu schreiben.
das heisst wenn ich computer starte soll ein programm ausfuhren.
es soll in 'C ' sein
mfg
thoma
 
Das Programm kannst du von init ausführen lassen;
"local" muss dabei aber im Autostart sein:

Code:
echo "programm" >> /etc/conf.d/local.start
rc-update add local default

Das ist allerdings die Vorgehensweise bei Gentoo, wie du das bei anderen Distributionen machen musst kann ich die leider nicht sagen.

MfG
Psyjo
 
Hello,
ich habe immer noch mein API geschaft. kann emand vielleicht ein Beispiel geben.ein programm für rs232 anzusprechen habe ich geschrieben. hier ist mein programm was ich geschrieben habe für rs232. für das programm brauche ich API.
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<termios.h>

#define TERM_DEVICE "/dev/ttyS0"
#define TERM_SPEED B9600

/*
int main()
{
int rs232();
//printf("eingabe\n");
return(0);
}*/


int main()
{
int eingabe =2;
int fd, old_flags;
ssize_t length;
char buffer[16];
struct termios term_attr;
fd_set input_fdset;

if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
{
perror("terminal: Can't open device"TERM_DEVICE);
return(1);

}
printf("geöffnet...\n");

/*RS232 Konfigurieren*/

if (tcgetattr(fd, &term_attr) !=0)
{
perror("terminal: tcgetattr() failed");
return(1);
}
printf("attribute gelesen...\n");

term_attr.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CREAD ;
term_attr.c_iflag = 0;
term_attr.c_oflag = OPOST | ONLCR ;
term_attr.c_lflag = 0;

if (tcsetattr(fd, TCSAFLUSH, &term_attr) !=0)
{
perror("terminal: tcsetattr() failed");
}
printf("atribute gesetzt...\n");

/*Standared Eingabe anpassen*/

if (tcgetattr(STDIN_FILENO, &term_attr) !=0)
{
perror("terminal: tcgetattr() failed");
return(1);
}
printf("Eingabe\n");
old_flags = term_attr.c_lflag;
term_attr.c_lflag &= ~(ICANON );
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) !=0)
perror("terminal: tcsetattr()failed");
/*Warteschleife: */
while (eingabe)
{

FD_ZERO(&input_fdset);//
FD_SET(STDIN_FILENO, &input_fdset);
FD_SET(fd, &input_fdset);

if (select(fd+1, &input_fdset, NULL, NULL, NULL)== -1)

perror("terminal: select() failed");

/*Zeichen von der Standardeingabe eingelesen und Serialeschnittstelle ausgegeben*/

if (FD_ISSET(STDIN_FILENO, &input_fdset))
{
if ((length = read(STDIN_FILENO, buffer, 16))== -1)
{
perror("terminal:read() failed");
}
else
if (buffer[0] == '\33')
break;
else

write(fd, buffer,length);

}

/*Daten Ven der Serialeschnittstelle eingelesen und ausgegeben*/

if (FD_ISSET(fd, &input_fdset))
{
if ((length = read(fd, buffer, 16)) == -1)
perror("terminal: read() failed");
else
write(STDOUT_FILENO, buffer, length);

}

}
term_attr.c_lflag = old_flags;
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
perror("terminal: tcsetattr() failed");

printf("Aborted.\n");
close(fd);
return(0);
}

danke mfg
thoma
 
1.

Code-Tags?!

2.

Eine Formatierung der Art

Code:
if (FD_ISSET(STDIN_FILENO, &input_fdset))
{
if ((length = read(STDIN_FILENO, buffer, 16))== -1)
{
perror("terminal:read() failed");
}
else
if (buffer[0] == '\33')
break;
else

write(fd, buffer,length);

}

ist nicht dein Ernst, oder?
 
hi,
das ist aber ernst. das ist ein teil von meinem projekt.meinst du das programm falsch.aber das funktioniert schon.
 
Also bin ich der einzige, der den Thread sehr verwirrend findet?

Das fängt schon damit an, dass hier immer von einer API gesprochen wird. Die Beschreibung sieht dann aber so aus: "es soll so funktionieren, wenn das gerät angeschlossen wird, muss automatisch ein fenster(editor, comand) öffnen, wo ich daten eingeben kann und daten vom gerät angezeigt wird."

Ich weiß nicht was thomaland26 schreiben will, aber eine API ist es nicht, von der Beschreibung her am ehesten wohl eine GUI zum ein-und auslesen von Daten am Serielport.
 
@pinky,

nein. Finde den Thread auch verwirrend.

Ich denke das er sowohl die API für die Anbindung der RS232 Schnittstelle benötigt als auch die GUI für das ein - und ausgeben der Daten.

@thomaland26
Bitte spezifizier doch nochmal genau was du benötigst. Ausserdem können wir dir keinen Daemon schreiben. Denn dafür fehlen uns einfach Informationen. Und wir sind nicht dafür da, deine Arbeit zu tun ;-).

btw. RS232 ist nicht Plug&Play fähig.

Havoc][
 
ok. du hast falsch verstanden glaube ich. also, das Quelcode was ich geschickt habe ist ein programm um rs232 anzusprechen.das ist kein API.ich will zu diesem Quellcode Ein API schreiben. das heist, um diesem Quellcode zu kompilieren muss ich bestimmte code im linux eingeben(z.B gcc datei.c -o filename).nach dem kompilieren muss man bestimmte daten eingeben um die daten von rs232(peripheriegerät) auszugeben.
jetzt muss ich ein API schreiben um diese Quellcode einfach zu kompilieren(ohne gcc datei.c -o filename),wie normal ein programm ausführt.und eingabe soll beliebig sein.beliebig heisst in diesem quellcode muss ich bestimmte code eingeben um die messdaten von peripheriegerät zu kriegen.statt diese code will ich durch Eingabe "messdaten" alle werte rauskriegen.ich denke dass ich gut erklärt habe.
mfg
 
das ist aber ernst. das ist ein teil von meinem projekt.meinst du das programm falsch.aber das funktioniert schon.

Nein,

ich meinte deinen Programmierstil!

Das ist jetzt nicht böse gemeint, aber wenn du sowas bei uns abliefern würdest, hättest du 3 Tage später deine Kündigung.

Dein Programm ist absolut unleserlich und enthält Strukturen die __bestenfalls__ fragwürdig sind.

Ich würde dir dringend empfehlen zuerst einmal ein paar Tutorials über guten Programmierstil zu lesen, z.B. hier: klick mich
 
das ist nicht meine arbeit. ich versuche ein gerät mit dem computer steurn kann.
 
...aber ich verstehe unter API auch ein Application Programming Interface, also eine Beschreibung einer Funktionsbibliothek und seiner Header-Dateien.

Eine GUI, also ein Graphical User Interface wirst du wollen.

Serielle Schnittstelle und PNP - kann ich mir nicht vorstellen...du bekommst vielleicht ueber PNP die Schnittstelle konfiguriert, aber sicherlich keine Pheripheriegeraete die du dann an die Schnittstelle anschliesst - und das ist der Knackpunkt an diesem Programmiervorhaben.

Was meiner Ansicht nach zu implementieren waere, waere ein Daemon (ein im Hintergrund arbeitendes Programm) der prueft ob etwas angeschlossen wird. Das kannst du machen in dem du sequentiell (also in Zeitintervallen) pruefst ob ein Geraet auf ein Kommando reagiert, oder indem du wartest ob ein Geraet eine Verbindung aufbauen will - mit udev geht da wohl so direkt nichts; hilft dir hoechstens deinen serielles Device-File, in der regel /dev/ttyS{0..4} umzubennennen, was aber keinen Sinn macht hier.

Du musst also dein Programm so auslegen das es sich nach dem Start in den Hintergrund setzt, das Console-Device wieder freigibt, z.B. so:
Code:
        /* damonize */

        data.pid = fork ();
        if ( data.pid == -1 ) {
                printf ( "Failed to fork." );
                exit ( 1 ); }

        /* free tty */

        if ( data.pid != 0 ) exit ( 0 );

        /* get session leader */

        setsid ();

        /* furthor code following */

...und dann kuckst ob was angeschlossen wird...muesste irgendwo hier in deinem Prog geschehen...
Code:
/*Standared Eingabe anpassen*/
...und dann machst du deine GUI-Interaktion, wie Fenster oeffnen, Eingabe holen, Eingabe senden, Reply lesen, ...usw. .

Schwieriger koennte werden es hinzubekommen das dein Programm immer Zugriff auf den X-Server bekommnt, weil sich der gegen fremden Zugriff per authentifizierung schuetzt, wenn er ordentlich aufgesetzt ist - da kann ich nicht weiterhelfen, waere selbst an der Loesung interessiert.

Das Porgramm von init aus zu starten ist dann das naechste/letzte.

Dazu musst du ein init-Skript schreiben das du dann in das entsprechende Runlevel-rc-Directory verlinkst, mit entsprechender Prioritaet. Keine all zu grosse Herausforderung. Bei mir (Debian) ist z.B. in /etc/init.d/skeleton ein Beispiel das zu kopieren waere und etwas angepasst werden koennte.

Die einfachste Weisse waere aber in etwa so:
Code:
#!/bin/sh

case $1 in
  start)  <path_to_binary>/<binary_name>;;
esac
...das in /etc/init.d ablegen, und dann z.B. (Runlevel 3 muesste default sein) mit 'ln -s /etc/init.d/<scriptname> /etc/rc3.d/90_<scriptname>' verlinken. 90 ist hier ein "ungefaehrlicher" Wert, da er recht spaet zum Zuge kommt - entscheidend fuer dich wird sein das udev vorher laeuft, wegen dem Device-File das du ja oeffnen moechtest.
 
@supersucker vielen dank für den link, meine programme waren zwar nicht ganz so unleserlich, aber die tipps, die ich mir aus dem wiki geholt hab sind auf jeden fall nicht schlecht
 

Ähnliche Themen

SELinux und IPTV

parser für peripheriegeräte

PHP Programmierer (m/w) für universitätsnahes StartUp

Ubuntu X / dbus problem

KDevelop-Programm mit GUI

Zurück
Oben