mikrocontroller.net

Forum: PC-Programmierung dll erstellen in c


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, will eine DLL in C erstellen die mir für ne Geäteverbindung über 
UDP bestimmte Funktionen bereitstellt, daten verfügbar, daten senden 
usw.
Die einzelnen Funktionen will ich dann in Matlab aufrufen können.
Für C gibts ja fertige API's  wie winsocket  für UDP verbindung

im Prinzip wollt ich gleich die einzelnen Funktion z.B socket 
öffnen,daten verfügbar usw. in jeweils eine extra Funktion von meiner 
DLL packen  und auf diese von Matlab zugreifen. Meine Frage nun- geht 
das überhaupt und falls ja hat eventuell noch jemand einen Link wie dlls 
unter c erstellt werden bzw. kennt jemand ein gute buch, wenn möglich 
auf deutsch


danke

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
__declspec(dllexport) IchbineineFunktion();

viel spaß mit der winsock library. du kannst dir das leben aber auch 
leichter machen und cygwin installieren, da bekommst zumindest den hauch 
von benutzbarkeit rein.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig rekonstruiere, muß in der DLL dann eine
Funktion mexFunction() stehen:
void mexFunction( int nlhs,
                  mxArray *plhs[],
                  int nrhs,
                  const mxArray *prhs[]
                  )
{
  ...
}
Das ist dann die Funktion, die später von Matlab aufgerufen wird.

Kompilieren kann man das Ganze direkt von Matlab aus (wenn
alles passend eingerichtet ist: mex irgendwas.c)

(mit allem Vorbehalt, das ist schon lange her).

Autor: häfftling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zur dll
ich weis nicht ob des so auch unter c geht aber es ist gut erklärt:
http://www.tutorials.de/forum/c-c-tutorials/312435...

zu winsock
das winsock zeugs hab ich mir da gelernt:
http://robsite.net/posts/netzwerkprogrammierung-mi...
ist eine schöne anleitung die man auch verstehen kann.

bei winsock bin ich der meinung von zwieblum, winsock ist nicht so 
schön.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab auch ne anleitung gefunden, aber das ist etwas undurchsichtig, gibts 
auch eine funktion "daten verfügbar" so ähnlich wie in jave da konnte 
man das schön empfangen mit wenn daten verfügbar dann lese daten, brauch 
unbedingt daten verfügbar da die daten kontinuirlich empfangen werden

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
select()

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine letzte Frage hab ich noch,

in meiner dll hab ich geschrieben nach anleitung

int startWinsock(void)
{

WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa);

}


jetzt kommt der Fehler [LINKER ERROR] undefined reference to 
WSAStartuo@8


hab aber winsock2 inkludiert, weiss einer wiese der die Funktion nicht 
kennt und ich das nicht kompilieren kann

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine Fehlermeldung des Linkers.

Die bedeutet, daß Du vergessen hast, die Library zu linken, in der 
WSAStartup implementiert ist.

Übrigens: Code und Fehlermeldungen nie abtippen, sondern per Copy&Paste 
einfügen, sonst können sich -- wie bei Dir -- Tippfehler einschleichen.

  WSAStartup

  WSAStartuo

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
trotzdem komisch, die ist doch eigentlich in der winsock2.h enthalten, 
hätte ich zumindest gedacht, das andere kennt er ja auch wie Socket s, 
und wo kann ich die dazulinken, vei den compilereinstellungen, oder 
macht man das direkt im Quellcode

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochmal: WSAStartuo mit >>>>o<<<< hintendran ist der falsche Name!
Falls es noch immer nicht geht, bitte mit vollständiger Fehlermeldung
(nicht irgendwie abgetippt, sondern exakt kopiert).

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab es jetzt hinbekommen, musste noch 2 lib dateien dazu linken

aber nun noch eine frage dieser select befehl gibts in meinem tutorial 
nicht, was muss denn dem übergeben werden und was gibt der zurück

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach und mexfiles bring mir hier nichts, die funktionieren wie ne normale 
funktion, man kann in matlab einfach so ne dll von c/c++ einbinden ist 
bedeutend leichter als die verwendung von mexfiles da man die werte nich 
umformatieren muss

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hab es jetzt hinbekommen, musste noch 2 lib dateien dazu linken
>
> aber nun noch eine frage dieser select befehl gibts in meinem tutorial
> nicht,

Dann such dir ein anderes Tutorial
oder benutz googel

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomm es einfach nicht hin, hab ein neues tutorial und da ist 
beschrieben wie man select befehl für einen server verwendet wenn man 
mehrere clients hat,

auch schreibe ich ein programm für einen client, also daten senden zum 
gerät und warten was zurückkommt, der recv befehl blockiert ja solange 
bis der daten bekommt, was sehr schlecht ist.  also will ich recv nur 
aufrufen wenn daten verfügbar sind aber wie soll das mit select 
funktionieren
kennt einer vielleicht doch noch ein toturial wo dieser fall mal 
beschrieben ist. überall erfahre ich bloß, dass man mit select befehl 
prüfen kann ob daten am port verfügbar sind aber wie genau wird nie 
erwähnt

Autor: Tuffke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eigentlich ganz nett gemacht:

http://www.c-worker.ch/tuts/select.php#problem

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das select() im Server ist übrigens das gleiche wie im Client...

Wenn man dann im client nur Daten von einem Server erwartet,
setzt man halt nur den fd dieser Verbindung in readfds ein.

Als Alternative könnte man den Socket auch auf "non blocking" setzen
und ohne select() einfach lesen.
Wenn keine Daten anliegen, bekommt man einfach 0 gelesene Bytes zurück
und probiert es später wieder.

Eine dritte Möglichkeit ist, sein Programm auf einen Hauptthread und
einen weiteren Thread pro Socketverbindung aufzuteilen.
Bei dem Client wären das der Hauptthread und einer für die
Verbindung zum Server.
Der Thread mit der Socketverbindung liest einfach und blockiert,
solange nichts kommt, während der Hauptthread normal weiterläuft.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt folgenden Code geschrieben, könnte das gehen oder ist das 
falsch, timeout würde ich noch setzten, hab leider noch kein Gerät zum 
testen, Fehler hab ich keine

}



DLLIMPORT int data_available(void)
{

FD_SET fdread;


rc = select(0,&fdread,NULL,NULL,NULL);


if(rc=FD_ISSET(s,&fdread))
return 0; //DAten liegen an



else
return 1;
}



DLLIMPORT int socket_close(void)


und in Matlab ruf ich dann auf:



x=calllib('Matlab_UDP', 'data_available')

if (0==x)
data=calllib('Matlab_UDP', 'read_data',234)
end

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das wird so nicht klappen. Davon abgesehen, daß die Benutzung von 
select komplett falsch ist, hast du das  Blockieren hier auch nur von 
recv nach select verlagert. Das einfachste wäre, wie Klaus schreibt, den 
Socket auf nonblocking umzuschalten.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut dann versuch ich das, gibts da auch wieder ein toturial wie man 
einen Socket auf nonblocking umschaltet, weil ich hab ma wieder keine 
Ahnung wie das gehen soll

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im MSDN sind die Winsockets ziemlich umfassend beschrieben.
Generell ist Netzwerkprogrammierung erstklassig beschrieben in:
  W. Richard Stevens
  UNIX Network Programming
  Volume 1: Networking APIs: Sockets and XTI
Dauert aber etwas mehr als 5 min...
select() ist dort übrigens auch gut beschrieben.

Nebenbei: Dein Kram wäre nicht so nervig zu lesen, wenn du mal Sätze 
formulieren würdest inklusive Satzzeichen und Groß-/Kleinschreibung.
Wenigstens soviel Mühe kann man sich schon geben, wenn man andere
Leute mit der eigenen Arbeit beschäftigt.

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Es funktioniert jetzt fast alles. Ich habe nur ein Problem. in meiner 
DLL Funktion read_Data gebe ich ein char* zurück. Unsigned char versteht 
Matlab nicht. Von Matlab wird das automatisch als cstring interpretiert. 
Jetzt hab ich das Problem, das es O Bytes gibt -> \0 terminiert mein 
String. Wie kann ich MatLab nun sagen das es mir die bytes als Binar, 
Hex Werte oder sonst was  ausgibt. Im nachhinein weis ich wie das geht, 
aber da wurde der String schon terminiert und ich komm an den Hexwert 
nicht mehr ran, weil die restlichen Daten in Matlab verloren gegangen 
sind.  Matlab soll also  das Byte als hex und nicht als String 
interpretieren

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.