www.mikrocontroller.net

Forum: PC-Programmierung dll erstellen in c

Autor: gast (Gast)
Datum:

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:

__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:

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:

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:

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:

select()
Autor: Gast (Gast)
Datum:

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 t. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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:

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:

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:

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:

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 Buchegger (kbuchegg) (Moderator)
Datum:

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:

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:

Das ist eigentlich ganz nett gemacht:

http://www.c-worker.ch/tuts/select.php#problem
Autor: Klaus Wachtler (mfgkw)
Datum:

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:

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:

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:

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:

Autor: Klaus Wachtler (mfgkw)
Datum:

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:

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net