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
Hi, ist schon eine Weile her bei mir, aber vergiss das Zeilenende nicht (CR oder CRLF)! Gruß Hendi
Versuch doch mal, die Adresse 31 statt 22 einzustellen. Lt. Beschreibung Seite 91 sendet es dann laufend die Messwerte über die RS-232 Schnittstelle.
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:
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
> 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:
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.