RS232 = Interpret + RS232-Funktionen, Beispiele
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

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:

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:

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);
}
|
|