Ingenieurbüro Bernhard Redemann
Elektronik, Netzwerk, Schulung
Das Bessere ist der Feind des Guten (Voltaire, 1694-1778)

 Bestellmöglichkeiten
   Im Online Shop

 Produkte / Bausätze
   USB-Produkte
   Bluetooth-Produkte
   HV-ISP-Progr. (Atmel)
   Schrittmotor Modul
   ENC28J60 Modul


    usbasp - nur 10,00 €

 Praxis / Freeware
   Projekt: Netzteil
   Arduino Clone
   Fritzing
   Eagle 3D
   DCF77 (Pollin)News!
   Messgerät (RS232-USB)
   HV-Programmer/Atmel µC

 News und Aktuelles
   19.02.2010:
   Androino2099: Update!
   26.01.2010:
   Androino2099: News!
   08.01.2010:
   USB-Set, Sonderangebot!
   29.12.2010:
   HV-Prog, Sonderangebot!
   28.12.2009:
   AVR Komplettset!
   23.12.2009:

Auslesen von Messgeräten
mit RS232 Interface über USB

Allgemeines
Viele Messgeräte wie Multimeter, Universalcounter etc. besitzen immer noch die alte RS232 Schnittstelle, um die Daten zum PC zu übertragen. Dieser kurze Artikel beschreibt, wie man diese Daten per C-Programm vom Messgerät über (RS232)/USB (FT232 oder FT2232) zum PC einlesen kann. Exemplarisch werden dabei die Multimeter Voltcraft VC506 (bzw. Protek 506) und das McVoice M-345pro (bzw. Velleman DVM345, MasTech MAS 345) verwendet.
Infoblatt zum M-345pro, DVM345 oder MAS345 o.ä.
Infoblatt zum VC506 (oder Protek506)
Infoblatt zum Tischmultimeter M9803R (oder M-980T)

Parameter der RS232
Das Herausfinden der Parameter der RS232 Schnittstelle für das jeweilige Messgerätes stellt oft ein erstes Problem dar. Wenn weder das Datenblatt noch eine Software zum Messgerät verfügbar sind, gibt es nur das Verfahren „trial and error“ - Versuch und Fehler. Wenn es eine Software zum Messgerät gibt, kann mit Hilfe eines RS232-Monitor Programms herausgefunden werden, welche Einstellungen zwischen den Geräten vereinbart werden. Der Folgende Screenshot zeigt dies anhand des M-345pro Multimeters:



Im Manual des Multimeters war über die RS232 Parameter nichts zu finden. Das DMM wurde an den COM1 angeschlossen und die Software Ser232Mon Version 1.0.1 Beta gestartet. Diese wurde auf COM1 eingestellt. Anschließend wurde die Software „MasView1.1“ gestartet und online (COM1) gesetzt. Im Fenster des SerMon wurde die Kommunikation sichtbar:
Multimeter M-345pro: 600 Baud, 7 Datenbits, Keine Parität, 2 Stopbits
Es ist zu erkennen, dass nach Senden eines „D“ (in Hex 44, unten, Write request) das Multimeter den gerade aktuellen Wert über die RS232 ausgibt, Beispiel:
0x44 -> D gesendet
Empfangen (14 Bytes, letztes CR):
0x440x430x200x2D0x300x2E0x30 0x300x300x200x200x200x560x0D
DC -0.0 00V(CR)
Ein wichtiger Hinweis dazu: Bei Verwendung von "Hyperterminal" als wird kein Wert des Multimeter M-345pro angezeigt. Die Ursache dazu ist unbekannt.
Für das Multimeter VC506 war es einfacher: In der Bedienungsanleitung waren die Parameter angegeben:
Multimeter VC506: 1200 Baud, 7 Datenbits, Keine Parität, 2 Stopbits
Auch bei diesem Multimeter muss ein Zeichen gesendet werden, damit es den aktuellen Messwert überträgt.

Die Hardware der Schnittstelle
Die Zweite Frage die sich stellt ist, wie die Schnittstelle an sich aufgebaut ist und ob irgendwelche Signalleitungen miteinander verbunden sind oder nicht. Die folgenden beiden Abbildungen zeigen die interne Schaltung der Multimeter:


M-345pro


VC506

Verbindung mit dem FT232 / FT2232
Da beide USB-Controller eine serielle Schnittstelle zur Verfügung stellen, ist es kein Problem, das Messgerät damit zu verbinden. Zwischen dem USB-Controller und dem Messgerät wird noch ein Pegelwandler in Form eines ST232CN oder MAX232 benötigt. Der Anschluss ergibt sich wie folgt:



Wenn alle Verbindungen richtig angeschlossen sind, kann man mit dem Programmieren beginnen.

Programm zum Auslesen der Messwerte
Zunächst werden für die Aufrufe FT_Write(), FT_Read() und FT_GetStatus() einige Variablen benötigt:
//Zum Senden 1 Byte (ein Zeichen)
char TxBuffer[1];
//Zum empfangen 15 Byte (für den Messwert)
char RxBuffer[15];
//Zeichen für das DMM
char ToSend[1]={"D"};

DWORD BytesWritten,BytesReturn,RxBytes,TxBytes,EventWord;


Anschließend werden die Parameter der Schnittstelle für das entsprechende Multimeter, in diesem Beispiel das M-345pro, gesetzt. Die printf() Anweisungen dienen nur zur Kontrolle:
//600 baud fürs M-345pro
statusFT=FT_SetBaudRate(handleFT,FT_BAUD_600);
//printf ("Status von BaudRate %d\n",statusFT);

//Keine Flusskontrolle, 2 Stoppbits, keine Parität
statusFT=FT_SetFlowControl(handleFT,FT_FLOW_NONE,FT_STOP_BITS_2,FT_PARITY_NONE);
//printf ("Status von FlowControl %d\n",statusFT);

//7 Datenbits
statusFT=FT_SetDataCharacteristics(handleFT,FT_BITS_7,FT_STOP_BITS_2,FT_PARITY_NONE);
//printf ("Status von DataChar %d\n",statusFT);

//Data Terminal Ready setzen
FT_SetDTR(handleFT);


Als nächstes wird (in einer Schleife) mit der Funktion ein „D“ gesendet, damit das Multimeter einen Wert liefert:
FT_Write(handleFT,ToSend,1,&BytesWritten);

Bevor man nun mit FT_Read() die Daten einlesen kann, muss zunächst mit der Funktion FT_GetStatus() festgestellt werden, ob Daten in den Buffer eingetroffen sind:
statusFT=FT_GetStatus(handleFT,&RxBytes,&TxBytes,&EventWord);

Mit der folgenden printf() Anweisung sieht man, wieviele Bytes das Multimeter sendet (i.d.R. 14, siehe oben):
printf ("Bytes vom DMM empfangen: %d \n",RxBytes);

Da die Multimeter nur sehr begrenzt Daten liefern können (in diesem Fall mit 600baud), ist eine Pause zwischendurch notwendig:
Sleep (1000);

Nun kann der Wert vom Buffer des FT232 / 2232 gelesen und angezeigt werden:
FT_Read(handleFT,RxBuffer,RxBytes,&BytesReturn);
printf("%s",RxBuffer);


Screenshot des Programms:


Die hier genannten Angaben beziehen sich nur auf die Verwendung der Multimeter VC506 und M-345pro. Bei anderen Multimetertypen (oder anderen Messgeräten) sind wahrscheinlich andere Parameter einzustellen. Daher sind alle Angaben ohne Gewähr.