Forum: PC-Programmierung ASCII-Befehle an HP33120A senden


von David S. (eledave)


Lesenswert?

Hallöchen mein Name ist Dave und ich habe ein Projekt vor.

Und zwar möchte ich ein C++-Programm schreiben, mit dem ich über eine 
serielle Schnittstelle (RS-232) SCPI-Befehle an einen HP33120A 
Funktionsgenerator senden kann, damit dieser bestimmte Signale (Sinus, 
Rechteck etc. mit Frequenz, VPP und Offsetspannung) ausgibt.
Dazu habe ich mir zum Testen der Schnittstelle HTerm runtergeladen, um 
überhaupt mal den FGen anzusprechen, jedoch klappt das noch nicht so 
ganz, hab da auch meines Wissens alles richtig eingestellt (also 
BaudRate, Databits, Parity etc.)
Im Handbuch des Gerätes steht, dass die Befehle eigentlich "simple" 
ASCII Befehle sind, die man doch eigentlich mit einem String versenden 
können müsste.
Da ich allerdings im Gebiet der Programmierung relativ neu bin bräuchte 
ich mal Eure Hilfe. :confused:
Der Befehl für ein "einfaches" Signal wäre zB "APPL:SIN 5000,2 VPP,1", 
also sprich: mach mir nen Sinus mit 5 kHz, 2 V peak to peak und 1 V 
Offsetspannung, sowas in etwa will ich mit HTerm erstmal an das Gerät 
senden und mir ausgeben lassen...
Im Voraus schonmal vielen Dank für Eure Hilfe!!

MfG Dave

von Walter T. (nicolas)


Lesenswert?

Antwortet das Gerät denn im Terminal auf *IDN? ?

von as (Gast)


Lesenswert?


von David S. (eledave)


Angehängte Dateien:

Lesenswert?

Walter T. schrieb:
> Antwortet das Gerät denn im Terminal auf *IDN? ?

Inwiefern meinst du das?

Ich habe es mal so probiert, da zeigt das Gerät aber nur einen Error 
(bitte nicht schimpfen, hab da noch nicht wirklich einen Plan von :-( )

von Jürgen D. (poster)


Lesenswert?

Wirklich 8 Datenbits und 2 Stopbits?
Das ist selten.

von David S. (eledave)


Lesenswert?

Ja so ist es vom Gerät vorgegeben, bzw voreingestellt, habe ich auch am 
Gerät selbst nachgeschaut in der I/O Konfiguration.

von Heiko G. (heikog)


Lesenswert?

Eventuell im hterm unter 'Input control'/'Send on enter' 'New line' 
auswählen? (Seite 214 im PDF-Manual von oben: A command string sent to 
the function generator must terminate with a <new line> character. )

von David S. (eledave)


Angehängte Dateien:

Lesenswert?

Da gibt es kein 'New line' zum auswählen in dem drop-down menü...

von Jürgen D. (poster)


Lesenswert?

New Line wird der LF sein.

CR Wagenrücklauf, der Cursor spring zum Begin der Zeile
LF Zeilensprung, der Cursor springt in die nächste Zeile

CR, LF oder CR LF sind so die üblichen Endzeichen von seriellen 
Telegrammen

Ansonsten kann man sich im HEX Modus ja alles mögliche selber 
zusammenbauen.
Ich würde da eh ein zweiten PC mit einem HEX Terminal parallel zu 
schalten in der Probierphase. Da sieht man was auf der Leitung 
tatsächlich los ist.

von David S. (eledave)


Lesenswert?

Super, danke für den Tip, es funktioniert alles super und so wie ich es 
mir vorgestellt habe! Es fehlte tatsächlich nur der 'line feed'. 
Zusätzlich hab ich mal noch den 'carriage return' aktiviert, also sprich 
CR-LF im drop-down Menü ausgewählt. Läuft alles wie geschmiert. Der 
nächste Schritt ist nun das alles mit einem eigenem QT-Programm zu 
realisieren, aber da guck ich erstmal wie weit ich komme und würde mich 
sonst hier nochmal melden wenn ich probleme habe (hoffe das ist in dem 
Forum hier ok).
Nochmlas danke!

von David S. (eledave)


Lesenswert?

Hallöchen alle zusammen!

habe nun wie gesagt mit HTerm alles ans laufen bekommen, habe es auch 
mit einem kleinen QT Programm schon geschafft!
Quelltext der main.cpp:
********************************************************************
#include "com_3.h"
#include <QApplication>
#include <QCoreApplication>
#include <QtSerialPort/QSerialPort>
#include <QTimer>
#include <iostream>
#include <string>
#include <windows.h>


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

    //Variable "serial" der Schnittstelle festlegen
    QSerialPort serial;

    //Konfigurieren der Schnittstelle
    serial.setPortName("COM3");

    //Baudrate festlegen auf 9600 Schritte/sec.
    serial.setBaudRate(QSerialPort::Baud9600);

    //Festlegung von 8 Datenbits
    serial.setDataBits(QSerialPort::Data8);

    //Festlegung von 2 Stopbits
    serial.setStopBits(QSerialPort::TwoStop);

    //Festlegung der Paritaet auf "NONE"
    serial.setParity(QSerialPort::NoParity);

    //Festlegung der Flusskontrolle auf "NONE"
    serial.setFlowControl(QSerialPort::NoFlowControl);  "

    //Oeffnen der seriellen Schnittstelle
    serial.open(QIODevice::ReadWrite);

    while (true)
    {
       //Fehlerspeicher loeschen
       serial.write("*CLS\r\n");

       //Geraet in Werkseinstellung versetzen
       serial.write("*RST\r\n");

       //Remote-Befehl fuer rechnergesteuerten Betrieb
       serial.write("SYST:REM\r\n");

       //Funktionsgenerierung "Rechteckfkt., 567.458 kHz, 2 VPP,1.03V 
Offsetspannung\carriage return\line feed"
       serial.write("APPL:SQU 567458,2VPP,1.03\r\n");

       //Geraet in Werkseinstellung versetzen
       serial.write("*RST\r\n");

        //Befehle ueber die serielle Schnittstelle versenden
       serial.flush();
    }

    //Schließen der seriellen Schnittstelle
    serial.close();

    return a.exec();
}
**********************************************************************
Mit dem Programm öffne ich halt die Schnittstelle und schicke die 
SCPI-Codes an das Gerät (es macht auch das was es soll). Nun möchte ich 
aber ein Programm schreiben, mit welchem ich über Buttons einzelne 
Befehle senden kann, also sprich nen Button für "Connect", "Disconnect", 
"Reset", "Clear" etc.
Habe das mal angefangen, funzt aber nicht so wirklich, habe 
wahrscheinlich die programminternen Bezüge noch nicht so ganz 
verstanden.
Habe die COM_2.PRO, com_2.h, main.cpp und die com_2.cpp mal angehangen, 
vielleicht kann mir jemand weiterhelfen :-)

Bis dahin
MfG Dave

COM_2.pro
************************************************************
#-------------------------------------------------
#
# Project created by QtCreator 2016-03-31T15:29:01
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = COM_2
TEMPLATE = app


SOURCES += main.cpp\
        com_2.cpp

#Einbindung der seriellen Schnittstelle
QT+= \
    serialport

HEADERS  += com_2.h

FORMS    += com_2.ui
***************************************************************


com_2.h
***************************************************************
#ifndef COM_2_H
#define COM_2_H

#include <QMainWindow>

namespace Ui {
class com_2;
}


class com_2 : public QMainWindow
{
    Q_OBJECT

public:
    explicit com_2(QWidget *parent = 0);
    ~com_2();

private slots:
    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::com_2 *ui;


};

#endif // COM_2_H
***********************************************************


main.cpp
***********************************************************
#include "com_2.h"
#include <QApplication>
#include <QCoreApplication>
#include <QtSerialPort/QSerialPort>

#include <QWidget>
#include "ui_com_2.h"


//using namespace std;

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

    com_2 w;

    w.show();
    return a.exec();

}
***********************************************************


com_2.cpp
***********************************************************
#include "com_2.h"
#include "ui_com_2.h"
#include <QtSerialPort/QSerialPort>
#include <QIODevice>
#include <iostream>
#include <string>
#include <windows.h>
#include <QPushButton>

com_2::com_2(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::com_2)
{
    ui->setupUi(this);
}

com_2::~com_2()
{
    delete ui;
}

void com_2::on_pushButton_6_clicked()
{

    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    //Konfigurieren der Schnittstelle
    serial.setPortName("COM3");                         //seriellen Port 
bestimmen
    serial.setBaudRate(QSerialPort::Baud9600);          //Baudrate 
festlegen auf 9600 Schritte/sec.
    serial.setDataBits(QSerialPort::Data8);             //Festlegung von 
8 Datenbits
    serial.setStopBits(QSerialPort::TwoStop);           //Festlegung von 
2 Stopbits
    serial.setParity(QSerialPort::NoParity);            //Festlegung der 
Paritaet auf "NONE"
    serial.setFlowControl(QSerialPort::NoFlowControl);  //Festlegung der 
Flusskontrolle auf "NONE"
    serial.open(QIODevice::ReadWrite);

}

void com_2::on_pushButton_7_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.close();
}

void com_2::on_pushButton_5_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.write("SYST:REM\r\n");
}

void com_2::on_pushButton_4_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.write("*CLS\r\n");
}

void com_2::on_pushButton_3_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.write("*RST\r\n");
}

void com_2::on_pushButton_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.write("APPL:SIN 456123,2VPP");
}

void com_2::on_pushButton_2_clicked()
{
    QSerialPort serial;                                 //Variable 
"serial" der Schnittstelle festlegen

    serial.write("APPL:SQU 567458,2VPP,1.03\r\n");
}

***************************************************************

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
Noch kein Account? Hier anmelden.