Ich habe mir den Artikel von "John Hint" bezüglich:
Serial Comm
Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications
Siehe unter folgendem Link:
http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/default.aspx
vorgenommen und einige Versuche mit C# angestellt. Es scheint Grundsätzlich alles zu funktionieren. Ich kann senden und empfangen über die serielle Schnittstelle.
Nun habe ich aber 1 Problem:
----> Die empfangenen Daten kann ich wohl darstellen in einer RichtTextBox, wie in seinem Beispiel aufgeführt. Dies nutzt mir aber wenig, denn ich möchte die empfangenen Daten in Form von Bytes direkt in ein Array einlesen z.B. in folgend deklariertes Array:
<PRE><B>
byte[] ReceivedBytes;
int ByteCount = 0;
</B></PRE>
für die Weiterverwendung in meiner Anwendung. Wird ein Byte empfangen, dann erfolgt automatisch ein Aufruf von folgender Prozedur in BaseTerm.cs
<PRE><B>
protected override void OnRxChar(byte c)
{ </B>
// Setzt sich über die vordefinierte Prozedur in CommBase.cs "OnRxChar(byte c)"
// hinweg (d.h. überschreiben), um die empfangenen Bytes selbst zu verarbeiten.
// Wird durchlaufen, wenn Zeichen empfangen wurden beziehungsweise sich noch
// im Empfangspuffer befinden bis dieser leer ist.
</PRE>
<PRE><B>
string s;
bool nl = false;
ASCII v = (ASCII)c;
if (settings.charsInLine > 0)
{
nl = (++lineCount >= settings.charsInLine);
}
if (settings.breakLineOnChar) // Ist ein Linebreak Charakter definiert?
if (v == settings.lineBreakChar) // Test ob Linebreak Charaktet anliegend?
nl = true; // Linebreak Charakter ist anliegend
if (nl)
lineCount = 0;
if (settings.showAsHex)
{
s = c.ToString("X2"); // In hexadezimaler Darstellung anzeigen
if (!nl)
s += " ";
}
else // Darstellung als ASCII-Wert
{
if ((c < 0x20) || (c > 0x7E))
{
s = "<" + v.ToString() + ">"; // ASCII-Wert in <> Klammer setzen
}
else
{
s = new string((char)c, 1); // Darstellbarer ASCII-Wert
}
}
frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
} // End of protected override void OnRxChar(byte c)
</B></PRE>
Am Ende erfolgt der Aufruf für die Darstellung der Empfangenen Bytes durch den Aufruf von
<B><PRE>
frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
</B></PRE>
in TermForm.cs
Jedesmal wenn ich den Versuch starte, das Byte c vom Aufruf
<B><PRE>
OnRxChar(byte c)
{
...
ReceivedBytes[ByteCount++] = c;
...
}
</PRE></B>
für meine Zwecke zu speichern, erfolgt ein Ausnahmefehler. Ich denke <B><PRE> OnRxChar(byte c) </B></PRE> ist der richtige Ort um die empfangenen Bytes abzufangen, oder habe ich einen
Überlegungsfehler gemacht! Wer kann mir bei diesem Problem vielleicht weiterhelfen oder wer hat eine mögliche Lösung?
<PRE></PRE>
Mit freundlichen Grüssen<PRE></PRE>
Roger Ramuz
Serial Comm
Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications
Siehe unter folgendem Link:
http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/default.aspx
vorgenommen und einige Versuche mit C# angestellt. Es scheint Grundsätzlich alles zu funktionieren. Ich kann senden und empfangen über die serielle Schnittstelle.
Nun habe ich aber 1 Problem:
----> Die empfangenen Daten kann ich wohl darstellen in einer RichtTextBox, wie in seinem Beispiel aufgeführt. Dies nutzt mir aber wenig, denn ich möchte die empfangenen Daten in Form von Bytes direkt in ein Array einlesen z.B. in folgend deklariertes Array:
<PRE><B>
byte[] ReceivedBytes;
int ByteCount = 0;
</B></PRE>
für die Weiterverwendung in meiner Anwendung. Wird ein Byte empfangen, dann erfolgt automatisch ein Aufruf von folgender Prozedur in BaseTerm.cs
<PRE><B>
protected override void OnRxChar(byte c)
{ </B>
// Setzt sich über die vordefinierte Prozedur in CommBase.cs "OnRxChar(byte c)"
// hinweg (d.h. überschreiben), um die empfangenen Bytes selbst zu verarbeiten.
// Wird durchlaufen, wenn Zeichen empfangen wurden beziehungsweise sich noch
// im Empfangspuffer befinden bis dieser leer ist.
</PRE>
<PRE><B>
string s;
bool nl = false;
ASCII v = (ASCII)c;
if (settings.charsInLine > 0)
{
nl = (++lineCount >= settings.charsInLine);
}
if (settings.breakLineOnChar) // Ist ein Linebreak Charakter definiert?
if (v == settings.lineBreakChar) // Test ob Linebreak Charaktet anliegend?
nl = true; // Linebreak Charakter ist anliegend
if (nl)
lineCount = 0;
if (settings.showAsHex)
{
s = c.ToString("X2"); // In hexadezimaler Darstellung anzeigen
if (!nl)
s += " ";
}
else // Darstellung als ASCII-Wert
{
if ((c < 0x20) || (c > 0x7E))
{
s = "<" + v.ToString() + ">"; // ASCII-Wert in <> Klammer setzen
}
else
{
s = new string((char)c, 1); // Darstellbarer ASCII-Wert
}
}
frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
} // End of protected override void OnRxChar(byte c)
</B></PRE>
Am Ende erfolgt der Aufruf für die Darstellung der Empfangenen Bytes durch den Aufruf von
<B><PRE>
frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
</B></PRE>
in TermForm.cs
Jedesmal wenn ich den Versuch starte, das Byte c vom Aufruf
<B><PRE>
OnRxChar(byte c)
{
...
ReceivedBytes[ByteCount++] = c;
...
}
</PRE></B>
für meine Zwecke zu speichern, erfolgt ein Ausnahmefehler. Ich denke <B><PRE> OnRxChar(byte c) </B></PRE> ist der richtige Ort um die empfangenen Bytes abzufangen, oder habe ich einen
Überlegungsfehler gemacht! Wer kann mir bei diesem Problem vielleicht weiterhelfen oder wer hat eine mögliche Lösung?
<PRE></PRE>
Mit freundlichen Grüssen<PRE></PRE>
Roger Ramuz
Comment