Autor Beitrag
Tomstrom
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 20.02.10 11:25 
Hallo Leute
Schon wieder ein Anfänger im Netz. Ich möchte ein Telegramm über eine RS232 Verbindung senden.
Das Telegramm hat ein Header von 6Byte und 1-200 Byte Daten.

Ich versuche Schrittweise dieses Vorhaben zu meistern.
Nun zu meiner Frage. Ich habe bereits erfolgreich Daten über eine Serielle Verbindung mit der SerialPort Klasse als String als Text und als Byte übertragung gemacht. Nun habe ich aber im Header ein 2Byte Feld, welches nciht funktionert. VisualStudio sagt immer er könne dieses char, ushort oder uint16 nicht als String unwandeln. Wer hat da einen Lösungsansatz?
Vielen Dank für die Mithilfe ;)

Dies ist der Funktionierende Code ohne eben ein 2Byte. Ich versuchte es mit einen 2ten Array, jedoch die Funktion port.Write unterstützt eben das uint16 nicht. Auch veruchte ichn es schon mit convert.To.uint16().


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
namespace RS232
{
  class Program
  {
    
    
    public static void Main(string[] args)
    {
      byte[] array = new byte[4];
      array[0] = 1;
      array[1] = 120;
      array[2] = 3;
      array[3] = 4;
    
      SerialPort port = new SerialPort("COM1"9600, Parity.None, 8, StopBits.One);
                  port.Open();
                  port.Write(array, 04);
                  port.Close();    
      
      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
    
  }
    
    
  
 }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 20.02.10 13:08 
Du möchtest also den ushort in ein byte-Array konvertieren?

Das sollte so funktionieren:
ausblenden C#-Quelltext
1:
2:
            ushort a = 1000;            
            byte[] bytes = BitConverter.GetBytes(a);


Oder wenn du das direkt in dein Array kopiert haben möchtest:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            byte[] array = new byte[6];
            array[0] = 1;
            array[1] = 120;
            array[2] = 3;
            array[3] = 4
            Array.Copy(BitConverter.GetBytes((ushort)10000), 0, array, 42);
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 20.02.10 19:16 
Zitat:
Danke hat funktioniert. Das Problem ist aber bei der Ausgabe über die Serielle Verbindung. Die Ausgabe ab dem 4 Index des Arrays ist nicht 2Byte sondern immer nur 1 Byte.

Dies ist unglücklich, da ich eine bestimmte Reihenfolge einhalten muss. Ich habe eine Lösung gefunden, welche aber nicht ganz supi ist. Hast Du da noch einen Vorschlag? Wenn ich dieses Problemchen gelöst habe, kann ich am Montag den ersten Livetest wagen, meines Telegramm-Simulators

Meine erste Lösung, welche nicht allr Bytes rausgibt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
namespace RS232 

class Program 



public static void Main(string[] args) 

byte[] array = new byte[7]; 
array[0] = 62// CRC 
array[1] = 00// LON Empfänger 
array[2] = 120// LON Absender 
Array.Copy(BitConverter.GetBytes((ushort)350), 0, array, 32); // Funktionscode 
array[4] = 01// Anzahl Daten 
array[5] = 05// Adesspunkt 

SerialPort port = new SerialPort("COM1"9600, Parity.None, 8, StopBits.One); 
port.Open(); 
port.Write(array, 06); 
port.Close(); 
Console.Write("Press any key to continue . . . "); 
Console.ReadKey(true); 


}


Hast du verstanden, was der Code macht? Durch den BitConverter wird ein Array generiert. Da du das Ergebnis aber nicht direkt in dein array einfügen kannst wird es kopiert. (guck dir bitte mal msdn.microsoft.com/d...ibrary/z50k9bft.aspx an)

Konkret werden die beiden Bytes aus denen der ushort besteht an die Stellen array[3] und array[4] kopiert. Danach überschreibst du aber den Index 4 wieder - das kann nicht gut gehen ;)

Ich würde es so machen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
byte[] array = new byte[] {62// CRC 
              00,// LON Empfänger 
              120// LON Absender 
              0// Wird gleich befüllt
              0// wird gleich befüllt
              01// Anzahl Daten 
              05}; // Adesspunkt
Array.Copy(BitConverter.GetBytes((ushort)350), 0, array, 32);

// usw.
Tomstrom Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 20.02.10 19:21 
Scheibenhonig, dann ist mal vorerst alles klar. Ich glaube ich werde mich dann nächste Woche mal wieder melden. Vorerst bin ich nur sehr glücklich und geh jetzt einen Schluck trinken. Na dann also Prost und vielen Dank. Gruss aus der Schweiz