Hallo Gemeinde.
Ich habe in einem Projekt folgendes Problem.
Ich möchte einem Detektor über meine serielle Schnittstelle (RS 485) gerne ein Array mit Hexadezimalziffern zusenden und hab mich dazu auch entsprechend belesen.
Das Array sieht wie folgt aus:
byte[] data_1 = new byte[9]
data_1[0] = 0x02;
data_1[1] = 0x03;
data_1[2] = 0x03;
data_1[3] = 0x02;
data_1[4] = 0x51;
data_1[5] = 0x02;
data_1[6] = 0x5E;
data_1[7] = 0xB1;
data_1[8] = 0x04;
Danach öffne ich meine Schnittstelle und schreibe die Daten dementsprechend hinein:
(Hier gehe ich einen sehr "langen" Weg, da er mir sonst (warum auch immer) meine Werte nicht exakt in die Schnittstelle geschrieben hat.)
serialPort1.Open();
if(serialPort1.IsOpen)
{
serialPort1.Write(data_1, 0 ,1);
serialPort1.Write(data_1, 1 ,1);
serialPort1.Write(data_1, 2 ,1);
serialPort1.Write(data_1, 3 ,1);
serialPort1.Write(data_1, 4 ,1);
serialPort1.Write(data_1, 5 ,1);
serialPort1.Write(data_1, 6 ,1);
serialPort1.Write(data_1, 7 ,1);
serialPort1.Write(data_1, 8 ,1);
}
Wenn ich jetzt über das Programm des Detektors meine Schnittstelle "belausche", steht da wie gewollt: 02 03 03 02 51 02 5E B1 04
Jetzt zu meinem Problem. Eigentlich müsste der Detektor automatisch auf diese Werte reagieren und mir seine Antwort zuschicken. Dies tut er aber nicht.
Jetzt ist meine Frage ob dem Programm ein StoBit fehlt nach dem übersenden oder ob es woanders dran liegt?
Die Eigenschaften meiner Schnittstelle sehen so aus:
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.DataBits = 8;
serialPort1.Handshake = System.IO.Ports.Handshake.None;
serialPort1.DtrEnable = true;
serialPort1.StopBits = StopBits.One;
Wenn das richtige im Detektor ankommt und er nicht reagiert wird es am Detektor liegen.
Stopbit usw. schickst du nicht selbst, das macht die Schnittstelle für dich. Wenn die richtig konfiguriert ist sollte das passen.
Guten Morgen.
Ich habe zur Kontrolle meiner Schnittstelle "AccessPort" im Hintergrund laufen und dort wird mir ebenfalls der richtige Byte Stream angezeigt. Vielleicht liegt es ja wirklich am Detektor...
Ich hätte da noch eine Frage zur Übertragung der Daten in die Schnittstelle.
Momentan ist es ja so gelöst:
serialPort1.Open();
if(serialPort1.IsOpen)
{
serialPort1.Write(data_1, 0 ,1);
serialPort1.Write(data_1, 1 ,1);
serialPort1.Write(data_1, 2 ,1);
serialPort1.Write(data_1, 3 ,1);
serialPort1.Write(data_1, 4 ,1);
serialPort1.Write(data_1, 5 ,1);
serialPort1.Write(data_1, 6 ,1);
serialPort1.Write(data_1, 7 ,1);
serialPort1.Write(data_1, 8 ,1);
}
Gibt es dafür noch eine schnellere Schreibweise?
In einer Lösung habe ich z.B. das entdeckt:
serialPort1.Open();
if(serialPort1.IsOpen)
{
serialPort1.Write(data_1, 0 ,9);
Wenn ich das so verwende, bekomme ich einen völlig anderen Byte Stream ausgegeben, nämlich: 02 A0 02 54 20 15 23 02
Ich verstehe die Schreibweise hinter
serialPort1.Write(data_1, 0 ,9);
nicht ganz.
Könnte mir jemand kurz erklären, was diese Schreibweise "macht"?
Was das macht steht hier SerialPort.Write-Methode (Byte[], Int32, Int32)
Einfach in Zukunft kurz nen Blick in die Doku werfen. Das bringt auch Dich schneller zum Ziel, da Du Deine Antwort sofort hast.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Was das macht steht hier
>
Einfach in Zukunft kurz nen Blick in die Doku werfen. Das bringt auch Dich schneller zum Ziel, da Du Deine Antwort sofort hast.
Wer die richten Sachen liest kommt auch zum Erfolg 👍
Diesen Artikel hatte ich, trotz das ich in der Microsoft Library schon fast zu Hause bin nicht entdeckt bzw. nicht so wahrgenommen.
Der Fehler ist, man sollte seinen Offset nicht erhöhen^^
Problem gelöst^^
-closed-
Das nächste Problem habe ich aber sofort bei der Annahme der zu erhaltenen Daten.
Ich möchte gerne die Daten welche mir vom Detektor übergeben werden in ein Array schreiben.
Gerichtet habe ich mich nach folgender Quelle:
https://msdn.microsoft.com/de-de/library/ms143549(v=vs.110).aspx
Mein Quelltext sieht so aus:
// Array deklarieren
byte [] Puffer = new byte[255];
// Schnittstelle auslesen
serialPort1.Read(Byte[] Puffer, 0, 255);
Mein Programm sagt mir, das "Byte[]" ein ungültiger Ausdruck ist.
**Warum? **
In der "Anleitung" unter dem Link weiter oben wird das Array genauso festgelegt.
.. dann hast Du noch mehr nicht gelesen.
[Hinweis] Wie poste ich richtig? Punkt 1.2 Nur ein Thema pro Thread
Nein.
Byte[] und byte[] ist nicht identisch. Während byte ein Schlüsselwort ist, ist Byte eine STruktur, für die der Namespace "System" eingebunden werden muss.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
serialPort1.Read(Byte[] Puffer, 0, 255);
Außerdem darf das da nicht stehen.
serialPort1.Read(Puffer, 0, 255);
Dann sollte es laut Doku auch gehen.
Inzwischen habe ich es hinbekommen, wenn auch auf einem etwas anderen Weg^^
Danke für die Hilfe =)
Das nächste Problem wird bestimmt nicht lange auf sich warten lassen 😁
Inzwischen habe ich es hinbekommen, wenn auch auf einem etwas anderen Weg^^
Das ist ein Forum. Das heisst: Geben und Nehmen. Kannst du also bitte denjenigen, die Hilfe suchen und diesen Thread hier finden, sagen, wie du das Problem gelöst hast?
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ja natürlich...
Das wollte ich schon noch machen, aber ich programmiere auf einem anderen PC da muss ich erst einmal den Code per Stick übertragen!
Code:
int increment = serialPort1.BytesToRead;
byte[] response = new byte[increment];
serialPort1.Read(response, 0, increment);
Das Zähle ich dann mit einer Schleife einfach hoch.
for(int i =0; i < response.Lenght; i++)
{
erg += (""+response[i].ToString("x2"));
}
Sonderlich elegant ist das aber nicht.
Sollte dennoch, wieder erwartend keine Antwort von dem Gerät kommen, friert das Programm ein und nichts geht mehr.
Daher sollte man besser auf das Event des Com-Ports setzen, wann neue Daten eingehen.
Alles hier nachzulesen:
Template Serial Port
Sonderlich elegant ist das aber nicht.
Okay Danke, das schau ich mir an.
Obwohl ich auch ehrlich sagen muss, für einen Neuling wie mich ist die gewählte Variante hoffentlich erst einmal ausreichend.
Bitte keine Full-Quotes [Hinweis] Wie poste ich richtig? 2.3