www.mikrocontroller.net

Forum: PC-Programmierung dll erstellen in c

Autor: gast (Gast)
Datum: 29.06.2009 21:13

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: 29.06.2009 23:07

__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: 30.06.2009 08:42

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: 03.07.2009 21:47

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: 05.07.2009 15:51

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: 05.07.2009 22:07

select()
Autor: Gast (Gast)
Datum: 06.07.2009 08:59

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: 06.07.2009 09:21

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: 08.07.2009 19:38

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: 08.07.2009 19:57

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: 08.07.2009 21:11

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: 08.07.2009 21:18

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: 08.07.2009 22:27

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: 09.07.2009 22:12

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: 09.07.2009 22:55

Das ist eigentlich ganz nett gemacht:

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

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: 10.07.2009 08:44

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: 10.07.2009 08:58

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: 10.07.2009 09:42

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: 10.07.2009 09:56

Autor: Klaus Wachtler (mfgkw)
Datum: 10.07.2009 09:58

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: 15.07.2009 15:03

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!
Zeichungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.
Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net