Funktionen einer DLL, bitte helft mir !



  • Hallo zusammen,
    ich habe hier ein riesen Problem. Ich habe eine DLL(native) bekommen,
    die eine Maschine ansteuert per USB
    Ein Codebeispiel wie die Funktionen der DLL aussehen, gibts auch aber ich werde einfach nicht schlau daraus.
    Mit C++ kenne ich mich nicht wirklich aus, ich muss es schaffen die Funktionen aus einer VB.Net Anwendung "anzusteuern".

    Die DLL bietet 4 Funktionen, von denen 2 offenbar die wichtigen sind.
    Es geht darum den Inhalt einer Textdatei(mit Koordinaten) an die Maschine zu übergeben. Offenbar ist der Pufferspeicher für die Daten klein, so daß die Daten, wenn ich das richtig verstanden habe stückweise "auf Anfrage" an die Maschine übergeben werden.
    Hier zunächst die Funktionen und die Beispiele wie die Funktionen Readdata und Writedata in C++ aussehen :

    Function Name: ReadData
    
    Desc: Read data in from cutter for Ready information
    Params: 
    inBuf		In		the begining address of the data buffer
    nInSize 	In		the length of data
    Return: return RT_SUCCEEDED if operation succeeded;
    		return RT_FAILED if operation failed and we will abort cutting;
    		return RT_RETRY if operaion failed, and it is recoverable. we need to recall the function.
    *********************************************************************/
     _declspec(dllexport) int _stdcall ReadData(char* inBuf, int nInSize);
    
    _declspec(dllexport) int  _stdcall WriteData(char* outBuf, int nOutSize);
    

    Das Beispiel in C++ sieht wie folgt aus :

    extern void SendData(/*CString data*/char *pline)		//·¢ËÍÖ¸Áî
    {
    	char sendf;
    //	int count,
    	int rein=0,reout=0;
    	int max=20000;
    
     	tagCutterParameters sets;
    
     sets.force = '200';
    
    	SendCutterSetting(sets,NULL);
    
    	//count=data.GetLength();
    
    //	AfxMessageBox(data);
    	while(max--)
    	{	
    		rein=ReadData(&sendf,sizeof(char));
    		if (rein==01 && sendf=='E')
    		{
    			reout=WriteData(pline,strlen(pline));
    			if (reout!=01)
    			{
    				AfxMessageBox("Command Send Faild!",MB_ICONSTOP);
    			}
    
    			break;
    		}
    	}
    	if (max==0)
    	{
    		AfxMessageBox("USB Port Overtime!",MB_ICONSTOP);
    		CloseUSBDevice(NULL);
    	}
    }
    

    Ich habe das so verstanden, daß bei

    rein=ReadData(&sendf,sizeof(char));
    

    die Maschine auf "ready für neue Daten in den Puffer" abgefragt wird, allerdings ist mir das mit &sendf nicht klar. Oben wurde sendf als char deklariert, was ist das nun mit dem "&" davor ? Die Funktion gibt doch den Rückgabewert nur in "rein" oder nicht ?
    Wieso kann sendf später "E" sein ?

    Den ersten Schwung Daten nimmt die Maschine an, die Funktion gibt 1 als Rückgabe für "rein", danach ist Schluss.

    Ich würde mich riesig freuen wenn jemand Licht in das Dunkel bringen könnte,
    ich raufe mir die Haare

    Lieben Gruß
    Dennis



  • Also ich versuche mal zu helfen
    1. bitte benutz

    -Tag und nicht [code ] (Editierfunktion nutzen  :) )
    2. Im Beispiel sind die Namen der Variablen, meiner Meinung nach, schlecht gewählt.
    [cpp]int rein=0,reout=0;
    

    Die Beiden Ints werden zur Kontrolle genutzt, ob überhaupt gelesen/geschrieben wird. rein wird vermutlich aus ReturnInput zusammengesetzt.
    und wie du in der Doku siehst, ist der Return-Wert kein "Datensatz" sondern nur Kontroll-Flags.

    Return: return RT_SUCCEEDED if operation succeeded;
            return RT_FAILED if operation failed and we will abort cutting;
            return RT_RETRY if operaion failed, and it is recoverable. we need to recall the function.
    

    zu deiner Frage wegen &sendf:
    & bedeutet, dass die Referenz der Variable übergeben wird. Also die Adresse (-> siehe Google Pointer + Referenzen)

    ReadData(char* inBuf, int nInSize); liesst also Soviele Bytes wie "nInSize" gross ist, in den Buffer inBuf. return wird nur als Kontrolle genutzt ob wirklich etwas gelesen wurde etc.



  • Hallo !

    Vielen Dank für deine schnelle Antwort.
    Das rein und reout kontrollflags sind, hab ich schon verstanden.

    Nur ist sendf ja wenn die funktion rein ausgeführt wird "leer", gerade erst initialisiert, die Funktion soll ja prüfen ob die Maschine ready ist.
    Woher soll denn später sendf den Inhalt 'E" bekommen haben ?

    Lg
    Dennis



  • Ich verstehe gerade nicht genau, was du meinst (spät und so).. ich versuche es mal so, und kommentier dir mal dein Beispiel etwas

    while(max--)                                // Schlaufe für Maximale Versuche den Status 'E' zu bekommen 
        {   
            rein=ReadData(&sendf,sizeof(char));     // 1 Byte lesen und in sendf schreiben
            if (rein==01 && sendf=='E')             // lesen erfolgreich und Empfangenes char = 'E'
                                                    // Vermutlich ist das die Abfrage ob die Maschine bereit ist um Daten zu empfangen
            {
                reout=WriteData(pline,strlen(pline));  // Kompletter String pline schreiben 
                if (reout!=01)                      // Falls Schreiben nicht erfolgreich
                {
                    AfxMessageBox("Command Send Faild!",MB_ICONSTOP);
                }
    
                break;                             // ende der while-schlaufe
            }
        }
        if (max==0)                                // falls die while-schlaufe komplett durchgelaufen ist ohne einmal ins "break" zu kkommen, USB-Device schliessen
        {
            AfxMessageBox("USB Port Overtime!",MB_ICONSTOP);
            CloseUSBDevice(NULL);
        }
    

    evtl hilft dir das.



  • Vielen Dank !

    Jetzt hab ichs kapiert ^^.
    Mein Problem war, das ich nicht begriffen habe, dass

    rein=ReadData(&sendf,sizeof(char));
    

    tatsächlich in sendf schreibt, ich hatte angenonmmen, daß
    die Funktion nur etwas in rein zurückgibt, nicht lachen bitte, wie gesagt
    von C++ versteht ich nix.

    Dummerweise hab ich die Funktion in VB.net versucht nachzustricken und
    hatte sendf als string deklariert, woraufhin ich auch keine Rückgabe in den String bekommen habe,
    Hab dann das ganze als Byte deklariert und dann über System.Text.ASCIIEncoding()
    doch tatsächlich mein "E" bekommen.

    Allerdings hab ich jetzt das nöchste Problem, ich glaube die Maschine erwartet eine bestimmte Menge Daten, meine eine exakte Größe der Daten für den Puffer, den ersten Schwung Daten nimmt sie an, und danach hängt sich der Thread komplett weg und nix geht mehr, kein zweites "E" 😞
    Da muss ich glaub ich noch ein bisschen probieren woran es liegt.

    Vielen herzlichen Dank auf jeden Fall erst mal.

    Lieben Gruß
    Dennis


Anmelden zum Antworten