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?
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.
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- SerialPort
Klasse gibt Ihnen nur rohe Bits in Stapeln von 8 Bits für jedes C# byte
oder 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 SerialPort
Ihnen 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.
string
auf 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.
Kohlschmied
Rehan Abbasi
Rehan Abbasi
Schwanand
Stanri
Kohlschmied
Lundin