Problem bei DLL mit CLR Call
-
also mein Ziel ist es über die Serielle Schnittstelle von einem Arduino-Board anfrage-Signale an den PC senden und dieser antwortet je nach Zustand des Rechners mit einem entsprechenden Antwort-Signal, welches vom Board ausgewertet wird. Auf meinem Board ist alles soweit funktionstüchtig. Nun soll die besagte DLL erstellt werden die die Kommunikation regelt.
Ob nun managed Klasse oder native Klasse ist mir eig egal... was wäre geeigneter?
ich möchte nur eines das funktioniert. Was muss ich dafür tun bzw weg lassen?hoffe das sind alle infos die ihr braucht um mir helfen zu können, danke
Vorbeugend: http://www.c-plusplus.net/forum/263084
kenne ich schon
-
Da würde ich gleich C# benutzen. Falls das nicht möglich ist, würde ich eine (native) C++ Konsolen Applikation erstellen.
Für die Kommunikation über den seriellen Port gibts bei C# die Klasse System.IO.Ports.SerialPort (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx).
Unter (native) C++ kann ich die Serial library for C++ aus einem Code Project Aritkel (http://www.codeproject.com/Articles/992/Serial-library-for-C) sehr empfehlen. Falls Du sowiso Boost einsetzt gibts aber dort auch eine Implementation bei Boost.Asio (http://www.boost.org/libs/asio).
-
ich nutze schon die Serial libary von codeproject und das gibt auch alles keine Fehlermeldung, mir geht es "nur" um den besagten Fehler.
error C3395: 'ArduinoFuncs::MyArduinoFuncs::kommunikation' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
Mit der Seriellen Kommunikation an sich dürfte alles Funktionieren.
C# habe ich schon gelesen das es da einfacher sein soll aber nun habe ich ja eig fast alles soweit fertig und so schlimm war es denk der Libary wirklich nicht da würde ich das ganze nur ungern nochmal umschreiben... kann ich also einfach meinen bestehenden Code so abändern das es funktioniert?
Danke
-
Ok, dann würde ich sagen:
Falls Du deine Library (welche die Serial Kommunikation kapselt) in einem (nativen) C++ Projekt benutzen möchtest soll deine Library natürlich auch eine native Library sein. D.h. Erstelle ein neues Projekt (Win32 Konsole Project) und wähle dort DLL oder falls es dir lieber ist Static Library (wäre dann noch einfacher).Deine DLL managed zu machen (/clr) bringt nur was, wenn Du sie z.B. in einer C# Applikation verwenden möchtest. Dann wirds allerdings langsam komplizierter.
Edit
Noch ein wenig konkreter, Du kannst keine managed Typen (z.B. System::Blabla oder die mit ^) in Funktionen verwenden die Du native exportieren möchtest!
-
ok werds mal so versuchen, danke schon mal ich meld mich wenn ich nicht weiter komme
-
Hi ich wieder, ich bin leider wegen Urlaub und dem schönen Wetter leider nicht oft dazu gekommen weiter zu machen. Also die DLL an sich funktioniert ohne Fehlermeldung auch das aufrufende Programm zum testen macht was es soll, danke an theta.
Nun habe ich jedoch noch ein Problem, ich weiß nicht ob das jetzt hier fehl am Platze ist aber hier steht einmal meine Thematik. Für die serielle Kommunikation verwende ich die Klasse CSerial:
Fehlermeldungen hab ich keine aber ich erhalte keine Kommunikation da der Port nicht geöffnet wird
CSerial serialPort1; int nPort = 4; int nBaud=9600; serialPort1.Open(nPort, nBaud); //hier erhalte ich immer false als Rückgabewert
kennt sich jemand mit CSerial aus, warum der False-Wert, also warum lässt der Port sich nicht öffenen? (Das Board hängt definitiv an Port 4 und die Baudrate stimmt auch)
Woran kann das liegen?
-
WIe wäre es mit Debuggen und auswerten von "GetLastError"?
-
GetLastError liefert "D"
und was soll ich daraus jetzt schließen?Google sagt mir auch nicht wirklich was das bedeuten soll
-
GetLastError liefert eine Zahl und kein Zeichen...
-
McKay schrieb:
GetLastError liefert "D"
GetLastError() liefert keinen String. Die Dokumentation dazu wird dir verraten, was genau es liefert...