Laden...

Nach Senden von Bytes zu einem Detektor kommt keine Antwort

Erstellt von Hurricane_One vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.851 Views
H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren
Nach Senden von Bytes zu einem Detektor kommt keine Antwort

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;

C
2.122 Beiträge seit 2010
vor 8 Jahren

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.

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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"?

16.841 Beiträge seit 2008
vor 8 Jahren

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.

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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-

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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.

16.841 Beiträge seit 2008
vor 8 Jahren

.. 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.

1.040 Beiträge seit 2007
vor 8 Jahren
  
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.

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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 😁

2.207 Beiträge seit 2011
vor 8 Jahren

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?

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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

T
708 Beiträge seit 2008
vor 8 Jahren

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

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 8 Jahren

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.

Hinweis von Coffeebean vor 8 Jahren

Bitte keine Full-Quotes [Hinweis] Wie poste ich richtig? 2.3