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
__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.
Wenn ich das richtig rekonstruiere, muß in der DLL dann eine Funktion mexFunction() stehen:
1 | void mexFunction( int nlhs, |
2 | mxArray *plhs[], |
3 | int nrhs, |
4 | const mxArray *prhs[] |
5 | )
|
6 | {
|
7 | ...
|
8 | }
|
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).
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-dll-erstellen-und-eigene-programme-einsetzen.html zu winsock das winsock zeugs hab ich mir da gelernt: http://robsite.net/posts/netzwerkprogrammierung-mit-sockets-in-c-pdf ist eine schöne anleitung die man auch verstehen kann. bei winsock bin ich der meinung von zwieblum, winsock ist nicht so schön.
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
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
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
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
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).
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
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
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
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
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.
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
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.
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
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.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.