Autor Beitrag
Ivy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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 user profile iconChristian S.: Topic aus Basistechnologien verschoben am Mi 22.09.2010 um 08:54
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Mi 22.09.10 08:32 
hey,
ja geschrieben hab ich jetzt schon an den Port:

ausblenden 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?:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Do 23.09.10 20:42 
user profile iconIvy hat folgendes geschrieben Zum zitierten Posting springen:

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:

ausblenden C#-Quelltext
1:
2:
3:
4:
//Hex in int konvertieren
int n = Convert.ToInt32("FF"16);
//zu zeichen casten:
char c = (char)n;
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 23.09.10 21:13 
user profile iconIvy hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconIvy hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Fr 24.09.10 06:20 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 24.09.10 20:16 
user profile iconyndaso hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Fr 24.09.10 22:49 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.