CP210xRuntime.dll einbinden und benutzen aber wie???



  • Hallo,
    Ich habe mir die "Conrad USB 4fach-Relaiskarte Baustein 5 V/DC Ausgangsleistung 8 A/24 V/DC" (http://www.conrad.de/ce/de/product/393905/Conrad-USB-4fach-Relaiskarte-Baustein-5-VDC-Ausgangsleistung-8-A24-VDC) geholt und dachte ich kann die karte mit einem C++ Programm nach beliben steuern. Jetzt musste ich feststellen das das C++ Beispiel programm nicht ordnungsgemäß von visual studio 2013 geladen wird. Um das manuell zu machen muss die CP210xRuntime.dll eingebunden werden und ich habe keine ahnung wie. Mit Dev-C++ habe ich das auch probiert und bin bei dem selben problem gelandet.
    Ich währe echt froh wenn mir jemand helfen kann das zum laufen zu bringen. Ich bin nach stundenlanger googlei nur noch am verzweifeln 😕
    MFG Penner42



  • Hallo,

    habe mir das gerade mal angesehen, da ich schon öfters die 8-fach serielle Relaiskarte benutzt habe und es da keine Probleme gab.

    Erkenntnis:
    Die 8-fach Karten verwenden den CP2102 als USB-Seriell Wandler, die Programmierung erfolgt einfach über Senden von Steuercodes über die serielle Schnittstelle.
    Diese 4-fach Karten verwenden den CP2104 und schalten die Relais über dessen GPIO-Bits. Dafür braucht man in der Tat diese DLL vom IC-Hersteller Silicon Labs.

    Die von Conrad mitgelieferten Visual C++ Beispiele werden auch von VC++ 2013 korrekt geladen und übersetzt. Da es sich aber um MFC-Programme handelt, braucht man natürlich mindestens die Professional Version.

    Für nicht MFC-Programme mit Visual Studio ist aber alles dabei, u.a. Headerdatei für die DLL und *.dll, *.lib und *.exp in 32 und 64-Bit, außerdem ein in VB geschriebener .net Wrapper.

    Man kann sich aber mit der DLL eigene Programme mit anderen Windows C++ Compilern schreiben. Wie das geht, steht im Ordner "Application Notes" im Dokument "AN226 (...) .pdf .

    Also: Programmieren lernen, insbesondere wie man eine DLL benutzt.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Erstmal danke für die schnelle Antwort.
    Also ich habe mir das Application Notes" im Dokument "AN226 (...) .pdf nochmal durchgelesen und habe jetzt folgendes gemacht.Ich habe nen neues Projekt erstellt(Visual studio 2013 Ultimate 3). Ich habe dann die ATL und die MFC Bibilotheken hinzugefügt.
    Dem Linker habe ich unter "Eingabe" die CP210xRuntime.lib hinzugefügt.
    Dann habe ich den Handle hinbekommen und jetzt bräuchte ich mal nen Beispiel wie ich die relais schalten kann ohne nen error zu Produzieren.
    Oder bin ich Komplett auf dem Holzweg?

    // c.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    #include "stdafx.h"
    #include "c.h"
    #include "CP210xRuntimeDLL.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // Das einzige Anwendungsobjekt
    
    CWinApp theApp;
    
    using namespace std;
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	HMODULE hModule = ::GetModuleHandle(NULL);
    
    	if (hModule != NULL)
    	{
    		// MFC initialisieren und drucken. Bei Fehlschlag Fehlermeldung aufrufen.
    		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    		{
    			// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
    			_tprintf(_T("Schwerwiegender Fehler bei der MFC-Initialisierung\n"));
    			nRetCode = 1;
    		}
    		else
    		{
    
    			string com="COM3";
    			CA2W lpc(com.c_str());
    			Sleep(1000);
    			HANDLE hMasterCOM = CreateFile(lpc, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    			//CP210x_STATUS CP210xRT_WriteLatch( 0 0);
    
    		}
    	}
    	else
    	{
    		// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
    		_tprintf(_T("Schwerwiegender Fehler: Fehler bei GetModuleHandle.\n"));
    		nRetCode = 1;
    	}
    
    	return nRetCode;
    }
    


  • Penner42 schrieb:

    Erstmal danke für die schnelle Antwort.
    Oder bin ich Komplett auf dem Holzweg?

    Ich bin mir nicht sicher. CreateFile ist schon richtig.

    Das ganze drumherum ist merkwürdig. Im ersten Posting erkennst du eine MFC-Anwendung nicht als solche, dein Visual Studio lädt sie angeblich nicht. Jetzt haben wir da so etwas seltsames wie eine MFC-Kommandozeilenanwendung.

    Das Relaismodul hat nix mit MFC zu tun. Nur die GUI des Beispielprogrammes ist damit geschrieben. Die ganzen MFC Initialisierungen in dem Programm sind eigentlich überflüssig.

    Warum man dann in einem MFC Programm dann std::string und ein Conversionmakro verwendet, statt std::wstring oder CString, keine Ahnung.

    Wenn es halt MFC sein soll, schau dir das an
    http://www.naughter.com/serialport.html
    das nimmt dir die meiste Arbeit mit der Schnittstelle ab und liefert auch den benötigten Handle. Man kann sich die Klasse auch nach Standard C++ umschreiben, dann kann man sie auch in nicht MFC Anwendungen verwenden.



  • Zu den MFC inizialisierungen, die hat visual studio alleine erzeugt und ohne sie giebts nen haufen fehler und ich habe keinen plan was die machen oder wie das funktioniert.
    Was funktioniert ist der c++ code.
    Was ich leider noch nicht funktioniert ist die anweisung
    "CP210x_STATUS WriteLatch(handle,mask,Latch);" aus dem unten angehängtem code.
    Die frisst aus irgent nem grund "handle" nicht. Oder ums mit den worten von Visual Studio zu sagen
    "IntelliSense: Ein Wert vom Typ ""HANDLE"" kann nicht zum Initialisieren einer Entität vom Typ ""CP210x_STATUS"" verwendet werden."

    // c.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    #include "stdafx.h"
    #include "c.h"
    #include "CP210xRuntimeDLL.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // Das einzige Anwendungsobjekt
    
    CWinApp theApp;
    
    using namespace std;
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	HMODULE hModule = ::GetModuleHandle(NULL);
    
    	if (hModule != NULL)
    	{
    		// MFC initialisieren und drucken. Bei Fehlschlag Fehlermeldung aufrufen.
    		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    		{
    			// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
    			_tprintf(_T("Schwerwiegender Fehler bei der MFC-Initialisierung\n"));
    			nRetCode = 1;
    		}
    		else
    		{
    			WORD Mask = 1, Latch = 1;
    			string com="COM3";
    			CA2W lpc(com.c_str());
    			Sleep(1000);
    			HANDLE handle = CreateFile(lpc, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    			//CP210x_STATUS WriteLatch(1,1);
    			CP210x_STATUS WriteLatch(handle,mask,Latch);
    
    		}
    	}
    	else
    	{
    		// TODO: Den Fehlercode an Ihre Anforderungen anpassen.
    		_tprintf(_T("Schwerwiegender Fehler: Fehler bei GetModuleHandle.\n"));
    		nRetCode = 1;
    	}
    
    	return nRetCode;
    }
    


  • Penner42 schrieb:

    Zu den MFC inizialisierungen, die hat visual studio alleine erzeugt und ohne sie giebts nen haufen fehler und ich habe keinen plan was die machen oder wie das funktioniert.

    Du hast wahrscheinlich den falschen Projekttyp angelegt.

    Penner42 schrieb:

    Oder ums mit den worten von Visual Studio zu sagen
    "IntelliSense: Ein Wert vom Typ ""HANDLE"" kann nicht zum Initialisieren einer Entität vom Typ ""CP210x_STATUS"" verwendet werden."

    Du rufst ja auch keine Funktion auf, sondern versuchst ein Objekt vom Typ CP21x_STATUS anzulegen.

    Wie gesagt, Programmieren lernen. Das wird so nichts.



  • wie ich erzeuge damit ein Objekt?
    wie ruft man denn die funktion Relays umschalten auf?
    Ich dachte das ist der befehl um ein relay zu schalten?
    So steht es doch in der deutschen anleitung?
    und warum legen die kein bespiel bei das man verstehen könnte?
    jetzt verstehe ich garnichts mehr?!?!



  • Wenn du schreibst

    CP210x_STATUS WriteLatch(handle,mask,Latch);
    

    ist das im Prinzip wie

    int blubb(42);
    

    Du versuchst also eine Variable namens WriteLatch von einem Typ CP210x anzulegen. Weil es so eine Klasse nicht gibt, erst recht keine mit einem Konstruktor mit drei Parametern, beschwert sich der Compiler zu recht.

    Wenn in der Doku steht

    Prototype: CP210x_STATUS CP210xRT_WriteLatch(HANDLE Handle, WORD Mask, WORD Latch)

    dann beschreibt das die Schnittstelle (aka Signatur) der Funktion. Das bedeutet nicht, dass du das so in deinen Code kopieren sollst. Dafür, dass du kein C++ kannst, können die Schreiber der Doku ja nichts.

    Was du eigentlich willst, ist

    CP210x_STATUS status = WriteLatch(handle,mask,Latch);
    


  • Geht trotzdem nicht
    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) int __stdcall CP210xRT_ReadLatch(void *,unsigned short *)" (__imp_?CP210xRT_ReadLatch@@YGHPAXPAG@Z)" in Funktion "_wmain".
    Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) int __stdcall CP210xRT_WriteLatch(void *,unsigned short,unsigned short)" (__imp_?CP210xRT_WriteLatch@@YGHPAXGG@Z)" in Funktion "_wmain".
    Fehler 3 error LNK1120: 2 nicht aufgelöste Externe



  • Jetzt kompiliert es ja schon mal. Nun brauchst du nur noch dem Linker die Library (.lib) mitgeben.



  • Problem ist ich habe schon nen bisschen mit c++ gearbeitet aber noch nie mit dll's oder linkern
    Wie macht man das???



  • googeln: "visual studio linker libraries"

    -> .Lib Files as Linker Input


Log in to reply