Autor |
Beitrag |
Ivy
      
Beiträge: 228
|
Verfasst: Mi 22.09.10 07:56
Hallo,
ich möchte die Serielleschnittstelle auslesen und testen. Ich habe die serialPort Komponente nun eingebunden und darin auch schon alle Einstellungen getätigt (Baudrate, COMPort...). Nun möchte ich eben die Daten verarbeiten. Vielleicht kann mir ja jemand helfen xD
grüßle ivy Moderiert von Christian S.: Topic aus Basistechnologien verschoben am Mi 22.09.2010 um 08:54
|
|
Greenberet
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: Mi 22.09.10 08:27
Schau dir mal die Methoden der SerialPort Klasse an
Stichwort: ReadByte, ReadChar, ReadExisting bzw zum schreiben an den Port: Write, WriteLine
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mi 22.09.10 08:32
hey,
ja geschrieben hab ich jetzt schon an den Port:
C#-Quelltext 1: 2: 3: 4:
| serialPort1.Open(); serialPort1.Write("ABC"); MessageBox.Show("In Port geschrieben"); serialPort1.Close(); |
wie kann ich das jetzt zurücklesen ??
edit so?:
C#-Quelltext 1: 2: 3: 4: 5:
| int bytesToRead = this.serialPort.BytesToRead;
byte[] b = new byte[bytesToRead];
this.serialPort.Read(b, 0, bytesToRead); |
wie kann ich jetzt die Hex zahlen in einen lesbaren string wieder umwandeln??
|
|
yndaso
      
Beiträge: 108
|
Verfasst: Do 23.09.10 20:42
Ivy hat folgendes geschrieben : |
wie kann ich jetzt die Hex zahlen in einen lesbaren string wieder umwandeln?? |
Hallo,
ich habe vor längerer Zeit so etwas ähnliches gemacht.
Bei mir waren die Hex Werte Ascii Codes.
Jedenfalls habe ich diese dann in int Werte konvertiert und die int Werte in char gecastet.
Etwa so:
C#-Quelltext 1: 2: 3: 4:
| int n = Convert.ToInt32("FF", 16); char c = (char)n; |
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 23.09.10 21:13
Ivy hat folgendes geschrieben : | wie kann ich das jetzt zurücklesen ?? |
Hast du zwei Computer mit einem RS232-Kabel miteinander verbunden? Dann stimmt dein Code. Beachte aber, dass du dich auf den Puffer nicht verlassen kannst, also musst du den Empfänger-Port öffnen, bevor der andere Computer etwas sendet.
Ivy hat folgendes geschrieben : | C#-Quelltext 1: 2: 3: 4: 5:
| int bytesToRead = this.serialPort.BytesToRead;
byte[] b = new byte[bytesToRead];
this.serialPort.Read(b, 0, bytesToRead); | 2 |
Du hast Zeichen geschrieben, also solltest du auch Zeichen lesen. Erstelle dafür einfach anstatt eines byte-Arrays ein char-Array. Dann wird auch automatisch die richtige Überladung von SerialPort.Read aufgerufen.
Anschließend musst du den char[] nur noch in einen String umwandeln:
C#-Quelltext 1:
| string Text = new string(b); |
Sei aber gewarnt, dass es bei diesem Code passieren kann, dass nicht der gesamte Text empfangen wird. Wenn zum Zeitpunkt, zu dem auf SerialPort.BytesToRead zugegriffen wird, nur ein Teil des Strings versendet wurde, wird auch nur dieser Teil empfangen. Um das zu Umgehen gibt es prinzipiell drei Möglichkeiten: Konstante Textlänge, Terminierungszeichen oder du schickst die Länge vorneweg. Was besser ist, hängt davon ab, ob die Länge des Textes variieren kann und wenn ja, ob er auch mal Nullen enthalten könnte.
|
|
yndaso
      
Beiträge: 108
|
Verfasst: Fr 24.09.10 06:20
Yogu hat folgendes geschrieben : |
Sei aber gewarnt, dass es bei diesem Code passieren kann, dass nicht der gesamte Text empfangen wird. Wenn zum Zeitpunkt, zu dem auf SerialPort.BytesToRead zugegriffen wird, nur ein Teil des Strings versendet wurde, wird auch nur dieser Teil empfangen. Um das zu Umgehen gibt es prinzipiell drei Möglichkeiten: Konstante Textlänge, Terminierungszeichen oder du schickst die Länge vorneweg. Was besser ist, hängt davon ab, ob die Länge des Textes variieren kann und wenn ja, ob er auch mal Nullen enthalten könnte. |
Alternativ kannst du das auslesen aber auch in einer Schleife machen.
Sobald BytesToRead = 0 ist, beendest du diese dann...
Abhängig von der Übertragungsrate, hatte ich das Problem, dass ab ca. 1k Daten zum Zeitpunkt des Lesens noch gar nicht alle Daten vorhanden waren.
Darum habe ich dann meine Schnittstelle in einer While Schleife (mit Timeout) ausgelesen...
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Fr 24.09.10 20:16
yndaso hat folgendes geschrieben : | Yogu hat folgendes geschrieben : |
Sei aber gewarnt, dass es bei diesem Code passieren kann, dass nicht der gesamte Text empfangen wird. Wenn zum Zeitpunkt, zu dem auf SerialPort.BytesToRead zugegriffen wird, nur ein Teil des Strings versendet wurde, wird auch nur dieser Teil empfangen. Um das zu Umgehen gibt es prinzipiell drei Möglichkeiten: Konstante Textlänge, Terminierungszeichen oder du schickst die Länge vorneweg. Was besser ist, hängt davon ab, ob die Länge des Textes variieren kann und wenn ja, ob er auch mal Nullen enthalten könnte. |
Alternativ kannst du das auslesen aber auch in einer Schleife machen.
Sobald BytesToRead = 0 ist, beendest du diese dann... |
Ja, und dann muss man hoffen, dass man weder zu wenig, noch zu viel erwischt hat. Viel Spaß! 
|
|
yndaso
      
Beiträge: 108
|
Verfasst: Fr 24.09.10 22:49
Yogu hat folgendes geschrieben : |
Ja, und dann muss man hoffen, dass man weder zu wenig, noch zu viel erwischt hat. Viel Spaß!  |
Ist doch Käse! Solange Daten ankommen ließt man sie!
Gut in meinem Fall war das letzte Byte die Checksumme. Daher wars nicht möglich zuviel oder zuwenig zu lesen...
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Sa 25.09.10 00:28
Wenn der Sender ziemlich langsam ist (zum Beispiel ein Mensch, der manuell Daten sendet), macht er möglicherweise eine Pause zwischen zwei Bytes - und dein Programm denkt, da kommt nichts mehr, weil nichts im Puffer steht, und kappt die Verbindung.
Der andere Fall tritt nur auf, wenn das Protokoll mehrere Kommandos pro Verbindung erlaubt. Hätten wir dann einen etwas eiligen Sender, der zwei Kommandos direkt hintereinander sendet, würde dein Programm denken, es hätte einen einzigen Befehl erhalten, weil die ganze Zeit Daten im Puffer stünden.
Abhilfe verschafft aber schon ein ganz einfaches vorangestelltes Byte, das die Länge des folgenden Pakets angibt. Weißt du, wie viel die Gegenstelle senden will, kannst du einfach eine gewisse Zeit warten und schauen, ob die angekündigte Anzahl von Bytes auch gesendet wurde. Wenn nicht, ist ein Timeout aufgetreten, wenn mehr empfangen wurde, bleiben die restlichen Daten einfach im Puffer und warten auf den nächsten Schleifendurchlauf.
|
|
|