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
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
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:
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
> 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.
> 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?
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.
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:
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
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.
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.