Skip to Content

Rigol DS1052E USB-Kommunikation

Posted on 2 mins read

Seit zwei Jahren habe ich das günstige Einsteiger-DSO (Rigol DS1052E) und bin damit recht zufrieden. Die mitgelieferte Software ist allerdings recht bescheiden, aber scheint zu funktionieren. Zumindest für Einzelbilder. Vor einer ganzen Weile habe ich mich mal mit dem USB-Protokoll beschäftigt und eine kleine Demo-Applikation auf Basis von Qt, Qwt und den Agilent IO Libraries umgesetzt. Im Video sieht man die Visualisierung des Datenstroms. Das Signal ist – recht unspektakulär – der Referenzkanal des DSOs zum Abstimmen der Tastköpfe.

Das Wichtigste zum Anfang ist es natürlich alle angeschlossenen Geräte – in diesem Fall USB-Geräte – ausfindig zu machen. Wie der unten stehende Code zeigt, ist dies recht schnell erledigt. Wichtig ist dabei eigentlich nur ?*INSTR, welches an jedes angeschlossene Gerät geschickt wird. Anschließend erhält man als Antwort die Identifikationsnummer. Alles Andere ist nun abhängig von den implementierten Befehlen des Geräts selber, wozu man die Dokumentation des Herstellers konsultieren sollte.

PS: Die maximale Wiederholrate ist limitiert auf 50 Hz. Diese wird durch das Gerät und nicht durch die Applikation oder Qwt oder Sonstiges herabgesetzt.

#include <QtCore/QCoreApplication>
#include <visa.h> 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

        ViUInt32 retCnt=0; 
        char buf [256] = {0}; 
        char instrDesc[100]={0}; 
        ViSession defaultRM,vi; 
        ViStatus status; 
        ViFindList find_list; 
        viOpenDefaultRM (&defaultRM); 
        status = viFindRsrc(defaultRM, "USB0::?*INSTR", &find_list, &retCnt, instrDesc); 
        status = viOpen(defaultRM,instrDesc, 
                VI_NULL,VI_NULL, &vi); 
        if (status != VI_SUCCESS)
        { 
            printf("Can not find USBTMC device!\n"); 
                viClose(vi); 
                viClose (defaultRM); 
        } else {
            printf("USBTMC device : %s\n",instrDesc); 
                viPrintf(vi,"*idn?\n"); 
                viScanf (vi, "%t", &buf); 
                printf("%s\n",buf); 
                viClose (vi); 
                viClose (defaultRM); 
        }
    return a.exec();
}

Ich muss mal schauen wo ich das Programm geparkt habe. Eventuell kann man ja doch noch etwas Sinnvolles daraus machen.