Forum: Mikrocontroller und Digitale Elektronik Messung mit Multimeter


von ani (Gast)


Lesenswert?

hallo,

ich hoffe ich bin hier im richtigen Forum, ich war mir bei der 
einordnung nciht so sicher.

Ich möchte gerne eine automatisierte Messung mit meinem Multimeter 
(aglient 34401a) durchführen.
( http://cp.literature.agilent.com/litweb/pdf/34401-90418.pdf)

Dafür habe ich am Multimeter folgende einstellungen vorgenommen:
 GPIB: 22 (ist glaube ich irrelevant)
 Schnittstelle: RS232
 Baudrate: 9600
 Parity : None (also acht datenbits)
 Sprache: SCPI

dann habe ich an meinem Hyperterminal (benutze ich nur für erste Tests) 
auch eine 9600-N-1 einstellung vorgenommen.

wenn ich jetzt den Befehl: MEAS:VOLT:DC? 10,0.003 sende, müsste 
eigentlich irgendeine antwort kommen. Leider sendet mein Multimeter 
garkeine antwort, wenn ich dann ncohmal den Befehlt sende bekomme ich 
eine Error meldung(131).

Was habe ich noch vergessen einzustellen oder woran könnte es liegen?
schon mal danke.

Gruß

ani

von Nico (nico123)


Lesenswert?

Benutzt Du ein gekreuztes Kabel?

von Hendi (dg3hda) (Gast)


Lesenswert?

Hi,

ist schon eine Weile her bei mir, aber vergiss das Zeilenende nicht (CR 
oder CRLF)!

Gruß Hendi

von Bernd K. (bmk)


Lesenswert?

Versuch doch mal, die Adresse 31 statt 22 einzustellen.

Lt. Beschreibung Seite 91 sendet es dann laufend die Messwerte
über die RS-232 Schnittstelle.

von Guido (Gast)


Lesenswert?

Hallo,

ani schrieb:
> Was habe ich noch vergessen einzustellen oder woran könnte es liegen?
> schon mal danke.

Du benötigst ein Kabel mit einer Belegung wie auf S. 147 des von Dir 
verlinkten Handbuches gezeigt.

Als Flusssteuerung im Hyperterminal Hardware einstellen.

Mit freundlichen Grüßen
Guido

von ani (Gast)


Lesenswert?

hi,

danke für eure antworten. Also mein kabel ist gekreuzt.

und wenn ich wie Bernd es gesagt hat die Adresse auf 31 stelle empfange 
ich auch die Messwerte.

Also war jetzt meine Idee, das Multimeter auf dauersenden zu stellen und 
immer nur dann den Messwert zu nehmen, wenn ich ihn gerade benötige. 
Dafür habe ich eine Klasse von codeprojekt integriert. Leider habe ich 
jetzt mit der Recive funktion ein problem. :-(

Hier meine Funktion:
1
LRESULT CMessungLaserDlg::OnSerialMsg (WPARAM wParam, LPARAM lParam)
2
{
3
  BYTE abBuffer[14];
4
  int i;
5
  DWORD  dwBytesRead = 0;
6
  const int nBuflen = sizeof(abBuffer)-1;
7
8
  do{
9
    pSerialIN.Read(abBuffer,nBuflen,&dwBytesRead);
10
    if (dwBytesRead >15)
11
    {
12
      str.Format(_T("%d"),abBuffer);
13
      for(i=0;i<15;i++)
14
      {
15
        abBuffer[i] = '\0';
16
      }
17
    }
18
    }
19
  while (dwBytesRead == nBuflen);
20
  return 0;
21
22
}

Ich will halt immer die gesendeten werte einlesen und wenn das Signal 
komplett da ist, das array in ein CString umwandeln.
Das Eingangssignal sieht so aus: +3.9379640E+00
Er springt definitiv in die Funktion, das habe ich getestet. Aber der 
Ausgabe wert ist halt falsch.

Wäre super, wenn ihr mir nochmal einen Tipp geben könntet.

danke und LG

ani

von Karl H. (kbuchegg)


Lesenswert?

>     pSerialIN.Read(abBuffer,nBuflen,&dwBytesRead);
>    if (dwBytesRead >15)
>    {

Schickt denn das Multimeter nach einem Messwert keinen Carriage Return 
(macht sich als Zeilenvorschub im Hyperterminal bemerkbar).

Wenn ja, dann solltest du dich da drauf synchronisieren und nicht 
empfangene Character zählen. Deine Zählung muss nur ein einziges mal 
durcheinander kommen, und dann stimmen deine Strings nicht mehr.

von Karl H. (kbuchegg)


Lesenswert?

>    if (dwBytesRead >15)
>    {
>       str.Format(_T("%d"),abBuffer);

Hä?
Ich dachte du kriegst da einen String, also einen Text.
In abBuffer steht dann schon der Messwert in Textform.

Ist dem nicht so?

von Karl H. (kbuchegg)


Lesenswert?

So wird das alles nichts.

Die OnSerialMsg wird doch aufgerufen, wenn 1 Zeichen über die 
Schnittstelle reinkommt. D.h. du musst die Einzelzeichen über mehrere 
Aufrufe in einem Buffer sammeln und erst dann, wenn alle Aufrufe für 
einen kompletten Messwert beisammen sind, wertest du alles aus.

von ani (Gast)


Lesenswert?

danke schon mal für eure hilfe.

ich habe jetzt nochmal probiert mein programm zu überarbeiten. Aber 
irgendwie will es nicht. Vielleicht habt ihr ja noch eine idee. Zuerst 
habe ich die folgende funktion abgeänert:
1
LRESULT CMessungLaserDlg::OnSerialMsg (WPARAM wParam, LPARAM lParam)
2
{
3
  pSerialIN.Read(szData,nBuflen,&dwRead);          
4
}

Ich habe die Funktion Read so verstanden, dass sie in szData die 
eingehenden daten schreibt. szData habe ich als ein char array[30] 
angelegt und global definiert. Genauso wie die anderen beiden Var. Jedes 
ankommende Ziechen müssste jetzt doch sofort in szData geschrieben 
werden oder?

Meine idee war es dann das Array in meinem Hauptprogramm in ein string 
umzuwandeln und mir aus dem String den richtigen Teil rauszuschneiden.
Dazu habe ich bisher diesen Teil im Hauptprogramm eingefügt.
1
str=szData;
2
MessageBox(str);

Allerdings wird mir bisher nur müll ausgegeben. könnt ihr mir vielleicht 
nochmal einen tip geben, wie ich es am besten mahcne kann. Irgendwie 
verzweifel ich daran gerade.

danke

ani

von Karl H. (kbuchegg)


Lesenswert?

ani schrieb:


> Ich habe die Funktion Read so verstanden, dass sie in szData die
> eingehenden daten schreibt.

Ja. Aber du weißt nicht wieviele Daten das sind.

Wenn das Messgerät den String

2.345E7

wegschickt, dann kann es durchaus sein, dass in deinem Programm die 
Funktion OnSerialMsg 3 mal aufgerufen wird.

Beim ersten mal kriegst du den Teilstring

  2.3

beim nächsten mal kriegst du

  45E

und beim dritten Aufruf kriegst du

  7 (+Carriage Return)

aus dem Read Aufruf zurück.
d.h. du musst die Einzelteile erst einmal zusammensetzen um den 
kompletten String zu bekommen!


> Allerdings wird mir bisher nur müll ausgegeben. könnt ihr mir vielleicht
> nochmal einen tip geben, wie ich es am besten mahcne kann. Irgendwie
> verzweifel ich daran gerade.

Setz dir im Debugger einen Breakpoint auf den Read Aufruf und sieh dir 
an, was aus dem Read rauskommt.

Sorry. Aber da musst du durch. Das ganze ist wirklich nicht schwer.

Und du solltest auf Codeproject, wo du den Code her hast, nochmal die 
Doku lesen. Wenn das dieselbe Klasse ist, die ich auch gefunden habe, 
dann wird OnSerialMsg nicht nur aufgerufen, wenn Zeichen reinkommen 
sondern auch zu anderen Gelegenheiten. Es ist eine verdammt schlechte 
Idee, diese Fälle zu ignorieren. -> Doku lesen, Beispielcode studieren.

von ani (Gast)


Lesenswert?

also ich hab es jetzt nochmal mit einem mikrocontroller getestet und da 
klappt es wunderbar.
Ich schicke einen befehl hin und dann bekomme ich "12345678" wieder und 
auch angezeigt. Klappt auch bei wiederholungsveruschen.

Wenn ich jetzt das gleiche Programm mit dem Multimeter laufen lasse 
bekomme ich nur ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ angezeigt. Beide Geräte 
spreche ich über serielle schnittstellen an.

Habe shconmal die Baudrate auf 300 runtergesetzt, aber hat nichts 
gebracht.

Habt ihr eine idee woran das liegen könnte?

Sorry wenn ich nerve. Aber schonmal danke für eure hilfe.

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.