RS232
Zurück Nach oben Vorwärts

RS232 = Interpret + RS232-Funktionen, Beispiele

RS232-Funktionen
Funktionen für die Initialisierung des COM-Ports:
 
Standard Initialisierung (InitRS232 verwendet Defaultwerte):
int InitRS232(char[] acPort, int iBaudrate, char[] acParity, int iDataBits, int iStopBits);
Einfache Initialisierung
acPort "COM1", .., "COM4"
iBaudrate 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000, 256000 Bauds
acParity "n"=no, "o"=odd, "e"=even, "m"=mark, "s"=space
iDatabits 5-8
iStopbits 1 oder 2
iResult 0=O.K., -8=Fehler
Beispiel iResult = initRS232("COM2", 9600, "n", 8, 2);
 
Benutzerdefinierte Initialisierung mit folgenden Funktionen:
int CreateFile(char[] acPort);
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = CreateFile("COM2");
 
int BuildCommDCB(char[] acPort, int iBaudrate, char[] acParity, int iDataBits, double dStopBits);
Automatische Zuweisung von Werten an die DCB Struktur (Port-Einstellungen).
acPort "COM1", .., "COM4"
iBaudrate 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000, 256000 Bauds
acParity "n"=no, "o"=odd, "e"=even, "m"=mark, "s"=space
iDatabits 5-8
dStopbits 1.0, 1.5 oder 2.0
iResult 0=O.K., -8=Fehler
Beispiel iResult = BuildCommDCB("COM2", 9600, "n", 8, 2.0);
 
int SetCommState(char[] acPort);
Initialisieren einer Schnittstelle mit den Port-Einstellungen (DCB).
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = SetCommState("COM2");
 
int SetupComm(char[] acPort, int iInQueue, int iOutQueue);
Initialisierung der Puffergrößen für Input und Output des spezifizierten Ports.
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = SetupComm("COM2", 1024, 1024);

 

TimeOuts
int SetTimeOuts(int[] aiTimeOuts, char[] acPort);
Timeout Parameter für Read- und Write-Operationen werden gesetzt.
Leseintervall =    Zeichenanzahl * Multiplikator (ms).
TimeOuts[3] und TimeOuts[4] sind momentan irrelevant, da kein Handshake verwendet wird und somit keine Schreib-Timeouts auftreten können.
acPort "COM1", .., "COM4"
aiTimeOuts[0] Maximales Zeitintervall zwischen zwei zu lesenden Zeichen. 0 bedeutet kein Timeout
aiTimeOuts[1] Read-Multiplikator für absolute TimeOut-Zeit
aiTimeOuts[2] Read-Konstante
wird zu Zeichenanzahl*Read-Multiplikator addiert. Multiplikator=0 und Konstante=0 bedeutet kein Timeout
aiTimeOuts[3] Write-Multiplikator für die absolute TimeOut-Zeit
aiTimeOuts[4] Write-Konstante
wird zu Zeichenanzahl*Write-Multiplikator addiert. Multiplikator=0 und Konstante=0 bedeutet kein Timeout
iResult 0=O.K., -8=Fehler
Beispiel
aiTimeOuts[0]=0; aiTimeOuts[1]=5; aiTimeOuts[2]=10; aiTimeOuts[3]=0; aiTimeOuts[4]=0;
iResult=SetTimeOuts(aiTimeOuts, "COM2");

Bei Puffergröße 100 Werte ergibt sich als Leseintervall (Wartezeit) 500 ms.
Wird die gesamte Wartezeit = 510 ms =  Leseintervall+Read-Konstante
Überschritten, so kehrt die Funktion ReadRS232() mit einem leeren Puffer zurück.

 

Datenübertragung
int ReadRS232(char[] acBuffer, int iBufferSize, char[] acPort);
Lesen eines Datenpuffers über die serielle Schnittstelle.
acPort "COM1", .., "COM4"
acBuffer Datenpuffer
iBufferSize Anzahl Bytes
iResult -8=Fehler
ansonsten die Anzahl der gelesenen Zeichen
Beispiel char Buffer[100];
iResult = ReadRS232(Buffer, 100, "COM2");
int WriteRS232(char[] acBuffer, int iBufferSize, char[] acPort);
Schreiben eines Datenpuffers über die serielle Schnittstelle.
acPort "COM1", .., "COM4"
acBuffer Datenpuffer
iBufferSize Anzahl Bytes
iResult -8=Fehler
ansonsten die Anzahl der gesendeten Zeichen
Beispiel char Buffer[100];
iResult = WriteRS232(Buffer, 100, "COM2");
int SetCommBreak(char[] acPort);
Die Datenübertragung wird unterbrochen, die Datenleitung wartet bis ClearCommBreak aufgerufen wird.
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = SetCommBreak("COM2");
int ClearCommBreak(char[] acPort);
Nach einer Unterbrechung der Datenübertragung durch SetCommBreak oder
EscapeCommFunction wird diese mit ClearCommBreak wieder hergestellt.
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = ClearCommBreak("COM2");
int EscapeCommFunction(char[] acPort, int iFunctionNumber);
Initialisieren einer Schnittstelle mit den Port-Einstellungen (DCB).
acPort "COM1", .., "COM4"
iFunctionNumber 1=Simulate XOFF received,
2=Simulate XON received,
3=Set RTS high,
4=Set RTS low,
5=Set DTR high,
6=Set DTR low,
7=Reset device if possible,
8=Set the device break line,
9=Clear the device break line.
iResult 0=O.K., -8=Fehler
Beispiel iResult = EscapeCommFunction("COM2", 3);

 

Modem-Status
int GetCommModemStatus(char[] acPort);
Liefert die Modem Control-Register Werte.
acPort "COM1", .., "COM4"
iResult -8=Fehler
1=CTS (clear-to-send) signal is on
2=DSR (data-set-ready) signal is on.
4=The ring indicator signal is on.
8=RLSD (receive-line-signal-detect) signal is on.
Beispiel iResult = GetCommModemStatus("COM2");

 

Löschen von Puffern bzw. der Datenübertragung,
Schließen der Schnittstelle.
int CloseRS232(char[] acPort);
Die serielle Schnittstelle wird geschlossen.
acPort "COM1", .., "COM4"
iResult 0=O.K., -8=Fehler
Beispiel iResult = CloseComm("COM2");
int PurgeComm(char[] acPort, int iFlags);
Entfernen von Buffer Inhalten (Output/Input) und/oder Abbrechen laufender Lese/Schrei-Operationen.
acPort "COM1", .., "COM4"
iFlags 1=Abbrechen laufender Schreiboperationen
2=Abbrechen laufender Leseoperationen
4=Output Buffer löschen, falls vorhanden
8=Input Buffer löschen, falls vorhanden
iResult 0=O.K., -8=Fehler
Beispiel iResult = PurgeComm("COM2", 1);

 

Beispiele
wpe2.jpg (5771 bytes)
input trigger I1 ("TYPEINFO", "TypeInfo","SWORD[1]","BIN");
output O1 ("TYPEINFO", "TypeInfo","UBYTE[]","TIME_DOMAIN");
output O2 ("TYPEINFO", "TypeInfo","SWORD[1]","BIN");

char Puffer[14]; int i; int b; double d; int TimeOuts[5];

init
    {
    InitRS232("COM2",1200,"n",7,2);
    TimeOuts[0] = 2000; TimeOuts[1] = 2000; TimeOuts[2] = 2000; TimeOuts[3] = 0; TimeOuts[4] = 0;
    SetTimeOuts(TimeOuts, "COM2");
    }
execute
    {
    ti_copy(O2,I1);
    ti_setname("test",O2);
    O2[0] = 1;
    i = I1[0];
    if (i == 1)
        {
        strcpy(Puffer,"Lesen");
        WriteRS232(Puffer,6,"COM2");
        ReadRS232(Puffer,14,"COM2");
        O1 << Puffer;
        O1 << "";
        }
    }
done
    {
    CloseRS232("COM2");

    }
Beispiel2 Kommunikation über Nullmodem Kabel
Voraussetzungen: 2 PCs mit ICONNECT-Installation und RS232 Modul, Nullmodemkabel.
Signalgraph des Senders:

rs232-sender.bmp (229988 bytes)
Programm des Senders (Modul RS232-Send):
input trigger I ("TYPEINFO", "TypeInfo", "DOUBLE[]", "TIME_DOMAIN");
output Transfer ("TYPEINFO", "TypeInfo", "DOUBLE[1]", "TIME_DOMAIN");

char buf[20];
int i;
int TimeOuts[5];
double start;
int data;
int erg;

init
{
erg= InitRS232 ("COM2",9600,"n",8,1);
if (erg)
printInt (erg);
TimeOuts[0] = 2000; TimeOuts[1] = 2000; TimeOuts[2] = 2000; TimeOuts[3] = 0; TimeOuts[4] = 0;
SetTimeOuts(TimeOuts, "COM2");
start= time();
data= 0;
}

execute
{
for (i=0 ; i<size (I) ; i++)
{
ftoa (buf, I[i], 5);
strcat (buf, " ");
erg= WriteRS232 (buf, strlen (buf), "COM2");
if (erg)
printInt (erg);
data= data + strlen (buf);
}
Transfer[0]= data/(time()-start)*1000;
}

done
{
erg= CloseRS232 ("COM2");
if (erg)
printInt (erg);
}
 


Signalgraph des Empfängers:
rs232-receiver.bmp (439952 bytes)

Programm des Empfängers (Modul RS232-Rec):
output O ("TYPEINFO", "TypeInfo", "UBYTE[]", "Text");

int TimeOuts[5];
char buf[1025];
double start;
int data;
int erg;
char Z;
int i;

init
{
erg= InitRS232( "COM1", 9600, "n", 8,1);
if (erg)
printInt (erg);
TimeOuts[0] = 0; TimeOuts[1] = 5; TimeOuts[2] = 10; TimeOuts[3] = 0; TimeOuts[4] = 0;
SetTimeOuts (TimeOuts, "COM1");
Z= itoc (0);
start= time();
data= 0;
}

execute
{
for (i=0 ; i<1025 ; i++)
buf[i]= Z;
erg= ReadRS232 (buf, 1024, "COM1");
if (erg)
printInt (erg);
data= data+strlen (buf);
O << buf;
}

done
{
erg= CloseRS232 ("COM1");
if (erg)
printInt (erg);
}