Web Design



BCB-BOX.DE

Zugriff auf die serielle Schnittstelle mit dem BCB 6.0

Hier finden sie ein Beispiel , wie sie mit dem BCB 6.0 über die COM1 die Displaydaten aus einem METEX Multimeter lesen können. Bei dem Multimeter M-4650CR
müssen die Signale DTR (+12V) und RTS (-12V) einen definierten Zustand haben. Sie werden als Spannungsquelle für die Optokoppler im Multimeter benötigt. Mit dem Beispielprogramm kann man mit einem Button die Displaydaten aus dem Multimeter auslesen.

Schnittstellenparameter METEX M-4650CR :
Baudrate :
1200 Bd
Parität : keine
Datenbits : 7 Bit ASCII
Stoppbits : 2 Bits

Sendecodes:
M - DMM sendet gespeicherte Daten
C - DMM löscht alle Daten
D - Displaydaten senden

Format des Datenworts , was das Multimeter sendet :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

A

C

-

1

.

8

8

7

 

 

V

 

 

CR

 

 

 

0

0

.

1

2

3

M

O

h

m

CR

Quellcode : Headerdatei :

//---------------------------------------------------------------------------
#ifndef dmmH
#define dmmH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:// Von der IDE verwaltete Komponenten
TMemo *Memo1;
TButton *Button1;
TLabel *Label1;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall Button1Click(TObject *Sender);
private:// Anwender-Deklarationen
HANDLE hSerial; // Handle auf Objekt
COMMTIMEOUTS TOutNeu, TOutAlt;
public:// Anwender-Deklarationen
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Quellcode Hauptprogramm :

//---------------------------------------------------------------------------
// Beispielprogramm : Meßwert von Multimeter Metex M-4650CR über RS232 lesen.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "dmm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DCB myCom; // Struktur definieren
hSerial = NULL;
// Com - Port öffnen
hSerial = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0 );
if ( hSerial == NULL ) // Fehlerabfrage
{
Application->MessageBox( "Fehler", "Fehler: Schnittstelle", MB_OK );
Close();
}
// Timeout bearbeiten
GetCommTimeouts( hSerial, &TOutAlt ); // Alte Einstellung speichern
TOutNeu.ReadTotalTimeoutConstant = 100; // Angabe ms
TOutNeu.ReadTotalTimeoutMultiplier = 0; // Lese Multiplikator in ms
TOutNeu.WriteTotalTimeoutMultiplier = 0; // Schreibe Multiplikator
TOutNeu.WriteTotalTimeoutConstant = 0;
SetCommTimeouts( hSerial, &TOutNeu ); // Neue Werte setzen

myCom.DCBlength = sizeof(DCB); // Speicherplatz schaffen
GetCommState( hSerial, &myCom ); // Aktuelle Einstellung laden
BuildCommDCB("1200,N,7,2", &myCom ); // Neue Werte einstellen
myCom.fDtrControl = DTR_CONTROL_DISABLE;
myCom.fRtsControl = RTS_CONTROL_DISABLE;
SetCommState( hSerial, &myCom ); // Werte setzen
EscapeCommFunction( hSerial, SETDTR | CLRRTS ); // RTS & DTR einschalten
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
SetCommTimeouts( hSerial, &TOutAlt ); // Alten Timeout wieder herstellen
CloseHandle( hSerial ); // Schnittstelle schliesen
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char cD = 'D';
char szBuff[14];
int nCount = 0;
DWORD dwRead = 0;

TransmitCommChar( hSerial, cD ); // Displaydaten abfragen
Sleep(500); // Warten aufs Multimeter

while( dwRead == 0 )
{ // Schnittstelle abfragen, ob Daten vorhanden
ReadFile( hSerial, szBuff, 14, &dwRead, NULL );
Application->ProcessMessages();
nCount++;
if ( nCount > 50 )
{
Memo1->Lines->Add( "Fehler : Timeout!!" );
break;
}
Sleep(10);
};

Memo1->Lines->Add(szBuff);
}
//---------------------------------------------------------------------------

Download Quellcode : dmm.zip

[Home] [English] [Informationen] [Screensaver] [Tooltips] [StrToInt] [Excel_Steuern] [Laeuftschon] [Direct3d] [Rs232] [I2C] [port] [Downloads] [Buchtipps] [Autor] [Links]