Konvertieren einer ASCII-Zeichenfolge in einen Bitstrom

Ich mache ein Projekt, in dem ich Daten von einigen Schaltern und Drucktasten auf den Pins von 8051 uC erhalte. Nun muss ich diese Daten auf den Portpins seriell zum PC übertragen. Auf der PC-Seite empfange ich die Daten in der C# .Net-Anwendung über die Klasse der seriellen Schnittstelle. Das Problem ist nun, dass ich möchte, dass die in der C#-Anwendung empfangenen Daten in Form einer Bitzeichenfolge anstelle von ASCII vorliegen.

Kann mir jemand anleiten, wie es erreicht werden kann?

Bitte geben Sie uns zunächst ein Schema der Verbindung zwischen dem 8051 und dem PC. Ich gehe davon aus, dass dies RS232 ist, aber das könnte falsch sein. Geben Sie uns dann ein paar Beispiele dafür, was Sie senden möchten und wie es interpretiert werden soll. zB wenn Ihr 8051 "1" sendet, soll es als "1" oder "00000001" oder "00110000" erscheinen oder ? Im Moment nicht genug Informationen.
Die Sache ist, dass es offensichtlich einige Kombinationen von 1 und 0 auf dem Port gibt. Wenn ich diese Kombination von 8-Bit-Daten vom Port nehme und an den PC übertrage, erhalte ich einige zufällige Symbole. Stattdessen möchte ich, dass es genau die gleiche Kombinationsbitzeichenfolge ist, dh Kombination von 8 Bits, wie sie auf dem Port von 8051 war.
Und ja, es ist eine RS232-Verbindung. Und ich verwende standardmäßige serielle Kommunikationsverbindungen zwischen 8051 und PC.
Sie erhalten zufällige Symbole, was bedeutet, dass Sie korrekte Daten erhalten, aber Sie lesen sie als ASCII!
Es sieht so aus, als ob dieses Problem eher ein Softwareproblem als ein Hardwareproblem ist - wenn die Symbole nur mit der c#-Anwendung in Binärdateien umgewandelt werden müssen, wäre diese Frage besser für Stackoverflow geeignet.
@RehanAbbasi ist Ihr Computer für binäre Übertragungen eingerichtet? Ich kenne die C#-Terminologie nicht, aber auf POSIX-Systemen möchten Sie, dass Ihr Pfad "roh" statt "gekocht" ist. dh Sie möchten nicht, dass der Treiber auf niedrigerer Ebene IRGENDEINE Übersetzung des eingehenden Datenstroms durchführt.
Gah ... Alles im Mikrocontroller und auf der RS-232-Leitung und im PC ist binär. In beiden Systemen gibt es nirgendwo magische Buchstaben, sie existieren nicht, bis Sie sich entscheiden, eine binäre Kombination auf einem Bildschirm zu drucken. Die Nachschlagetabelle, die einen bestimmten Binärcode in einen grafischen Buchstaben übersetzt, wird als ASCII-Tabelle bezeichnet. Vielleicht beschließt Ihr C#-Frontend, diese Konvertierung für Sie durchzuführen und Sie mit Zeichen aus den Daten zu füttern. Gegebenenfalls müssen Sie ihm mitteilen, dass Sie Rohdaten (Ganzzahlen) möchten. In diesem Fall ist Ihre Frage nicht zum Thema, da sie zu 100% mit der seriellen C # -Schnittstelle zusammenhängt.

Antworten (2)

Es ist nicht klar, was Sie fragen, da ASCII ein Bitstrom ist .

In jedem Fall, insbesondere wenn Sie eine eigene Anwendung auf dem PC haben, ist es sinnvoll, Daten binär über die serielle Leitung zu senden. ASCII ist für Menschen, aber Sie haben zwei Maschinen, die miteinander kommunizieren. Der PC kann die Daten in jeder für die Benutzer geeigneten Form anzeigen, aber es ist nicht erforderlich, dass dies dem Format der vom Mikrocontroller gesendeten Daten entspricht.

Da das begrenzteste Ende der Kommunikationsleitung der Mikrocontroller ist, verwenden Sie das einfachste Format dafür. Das sendet nur rohe Bytes. Normalerweise verwende ich Pakete, die mit einem Opcode-Byte beginnen, gefolgt von den Daten, die für diesen Opcode definiert sind. Es ist einfach, in einem kleinen Mikro zu senden und zu empfangen, ohne dass sperrige und langsame ASCII-zu-Binär- und Binär-zu-ASCII-Konvertierungsroutinen erforderlich sind.

Auf der PC-Seite haben Sie im Verhältnis zur Geschwindigkeit der seriellen Leitung im Wesentlichen unendliche Rechenleistung, sodass jedes Format verarbeitet werden kann. Rohe Binärdateien sind jedoch so einfach wie es dort hinkommt.

Das einzige, worauf Sie achten sollten, ist, keine impliziten Annahmen über die Byte-Reihenfolge zu treffen, die der Hostcomputer für Multibyte-Werte verwendet. Definieren Sie, was für den Mikrocontroller am einfachsten ist, und arbeiten Sie dann auf der PC-Seite damit. Nehmen wir zum Beispiel an, dass der Mikro Multibyte-Daten in der Reihenfolge der kleinsten bis höchstwertigen Bytes speichert. Machen Sie nicht so etwas Dummes wie eine Union in C zu definieren und die empfangenen Bytes in Byte-Feldüberlagerungen mit breiteren Werten zu schreiben. Das macht Ihr Host-Programm maschinenabhängig. Schalten Sie stattdessen um und alles ist in Ordnung. Um beispielsweise eine 16-Bit-Menge in eine breitere Ganzzahl zusammenzufügen, schreiben Sie das erste Byte direkt hinein, dann ODER das zweite Byte hinein, nachdem dieses Byte um 8 Bit nach links verschoben wurde. Das funktioniert immer, unabhängig von der Byte-Reihenfolge des Host-Rechners.

Für die Konvertierung von Binärwerten in ASCII gibt es in jeder Sprache verschiedene Möglichkeiten. Das ist ein reines Sprachproblem und hier außerhalb des Rahmens und außerdem sowieso trivial.

Eine weitere Sache, die ich hinzufügen möchte, ist, dass OP C# verwendet, das viele eingebaute Klassen hat, um von Binär nach Hex in ASCII oder was auch immer zu konvertieren!
@Swan: Ich gehe davon aus, dass jede Sprache solche Einrichtungen zur Verfügung hätte.
@OlinLathrop Die Sache ist, dass es offensichtlich einige Kombinationen von 1 und 0 auf dem Port gibt. Wenn ich diese Kombination von 8-Bit-Daten vom Port nehme und an den PC übertrage, erhalte ich einige zufällige Symbole. Stattdessen möchte ich, dass es genau die gleiche Kombinationsbitzeichenfolge ist, dh Kombination von 8 Bits, wie sie auf dem Port von 8051 war.
@RehanAbbasi, es sieht so aus, als müssten Sie sich ein wenig darüber informieren, was ASCII ist.
@Rehan: Es hört sich so an, als würden Sie erwarten, an einem Ende Binärdaten in die Zeile zu schreiben, aber am anderen Ende als ASCII-Zeichen erscheinen? So geht das nicht. Wählen Sie ein Format für die Übertragung, das ich als binär empfehle. Stellen Sie dann sicher, dass beide Enden daran festhalten. Sie haben anscheinend eine ASCII-Konvertierung auf die eine oder andere Weise. Dies kann ein Problem sein, wenn "Blackbox"-Bibliotheken verwendet werden. Stellen Sie sich die serielle Leitung als Transport von Bytes vor und arbeiten Sie dann selbst von dort aus.

Was Sie sagen, klingt so, als würden Sie tatsächlich die genauen Bits erhalten, die am Port ankommen (mit Ausnahme von Start- / Stoppbits usw.), aber Sie haben sich irgendwie getäuscht, zu glauben, dass der Inhalt Ihrer Variablen "Symbole" sind. Das macht keinen Sinn – die .NET- SerialPortKlasse gibt Ihnen nur rohe Bits in Stapeln von 8 Bits für jedes C# byteoder 16 Bits für jedes C#s char. Ob diese Bits Symbole oder etwas anderes kodieren oder nicht, müssen Sie entscheiden.

Was Sie mit diesen Bits tun , nachdem Sie sie erhalten haben, ist Ihre Entscheidung. Sie können die 8 Bits in Ihrer Variablen so behandeln, alsbyte ob sie die Nummer eines ASCII-Zeichens kodieren und dieses Zeichen anzeigen, aber niemand sagt, dass Sie das tun müssen . Bits sind Bits; Es gibt nichts Besonderes an diesen 8 Bits, das besagt, dass sie als ASCII-Codepunkt interpretiert werden müssen. Sie können damit machen, was Sie wollen -- byte(oder übrigens char) ist ein arithmetischer Typ, und alle üblichen Verschiebungen und logischen Operationen zum Manipulieren von Bit-Strings stehen Ihnen sofort zur Verfügung.

Sie haben doch nicht erwartet, dass SerialPortIhnen die Bits in Form der ASCII-Codes für die Zeichen „0“ und „1“ liefern, oder? Das wäre verschwenderisch und für die meisten praktischen Zwecke völlig sinnlos.

Und wenn Sie die Daten irgendwie schon als stringauf der C#-Seite haben, finden Sie vielleicht so etwas wie System.Text.Encoding.ASCII.GetBytes()hilfreich. Lesen Sie jedoch unbedingt die Dokumentation dazu; es tut möglicherweise nicht genau das, was Sie erwarten.