Laden...

SerialPort - DumpView

Erstellt von Doltsche vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.303 Views
D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren
SerialPort - DumpView

Hallo zusammen

Ich bin daran, eine RFID über einen COM Port auszulesen.
Zwar kann ich mittels der SerialPort Class Daten auslesen, jedoch wird mir etwas merkwürdiges angezeigt d.h. mir werden einfach ein paar Sonderzeichen angezeigt. Nun habe ich mir mal einen Serial Port Monitor aus dem Internet heruntergeladen. In der Tabellenansicht zeigt er mir praktisch die selben Sonderzeichen. Wenn ich jedoch in eine sog. "Dump View" wechsle wird mir die korrekte Zahl angezeigt.
Wie kann ich das in C# erreichen?

LG Samuel

T
708 Beiträge seit 2008
vor 14 Jahren

Hallo Doltsche,

unter DreaminCode gibt es ein nettes Tutorial, Hauptaugenmerk solltest du auf den folgenden Punkt setzten:

You will notice in this method we call three methods:

    * HexToByte
    * ByteToHex
    * DisplayData

Anhand dieses Tutorials habe ich ein ComPort verarbeitendes Programm geschrieben, das man vollständig konfigurieren kann und die Ergebniswerte fast unbegrenzt konvertieren kann. Leider ist nur die Schnittstelle in C# gelöst, daher kann ich dir keinen Code zur Verfügung stellen.

Hoffe so bringt dich das aber schon weiter!
TriB

U
1.688 Beiträge seit 2007
vor 14 Jahren

Wie kann ich das in C# erreichen?

Was denn? Es sind mehr Details nötig: was machst Du, was bekommst Du, was willst Du?

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren

Hallo

Danke für die Antwort.
Ich werde mir das von DremInCode gleich mal anschauen.
Hier trotzdem noch eine ausführlichere Beschreibung meiner Situation:

Folgenden Code verwende ich zum Auslesen des Ports:

 private SerialPort port = new SerialPort("COM2",
            9600, Parity.None, 8, StopBits.One);

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            port.Encoding = Encoding.UTF8;
            // Show all the incoming data in the port's buffer
            string data = port.ReadExisting();

            richTextBox1.Invoke(new EventHandler(delegate
            {
                richTextBox1.SelectedText = string.Empty;
                richTextBox1.SelectionColor = Color.Blue;
                richTextBox1.AppendText(data); // Anzeige
                richTextBox1.ScrollToCaret(); // Bildlauf
            }));
        }


        private void SerialPortProgram()
        {
            Console.WriteLine("Incoming Data:");

            // Begin communications
            port.Open();

            // Attach a method to be called when there      
            // is data waiting in the port's buffer
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }

Der Aufruf der Funktion SerialPortProgram erfolgt in einer Ereignisprozedur.

Halte ich nun die RFID an den Leser, welcher am COM2 angeschlossen ist erscheint folgendes in der richTextBox: ö~öwö wobei das "ö" durch so ein rechteckiges kästchen zu ersetzen ist.

Eingentlich sollte allerdings folgendes erscheinen:
30 32 30 32 30 33 34 39 39 31 33 39 38 37 0D 0A bzw. 02020349913987..

LG Samuel

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

was steht denn in "data", bevor es in die RichtextBox geschrieben wird?

K
133 Beiträge seit 2009
vor 14 Jahren

Halte ich nun die RFID an den Leser, welcher am COM2 angeschlossen ist erscheint folgendes in der richTextBox: ö~öwö wobei das "ö" durch so ein rechteckiges kästchen zu ersetzen ist.

Sowas geschieht wenn du Werte anzeigen lassen willst, für die keine Zeichen in der Schriftart hinterlegt sind. Du solltest die ankommenden Daten erstmal in hexadezimalcode umwandeln und diesen dann ausgeben.

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren

Hallo

Danke für die Antworten.
Ich werde das Morgen mal anschauen.
Jetzt kann ich leider nicht, da ich Zuhause bin und sich der Batchleser im Betrieb befindet.

LG Samuel

185 Beiträge seit 2005
vor 14 Jahren

Anzeige der Datenbytes als Hex-Folge:


BitConverter.ToString(data);

Du solltest dir die Daten aber nicht als string holen, sondern als Byte-Array.

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren

Hallo

Danke für die Antwort.
Ich habe nun folgendes ausprobiert:

            int byteArrayLength = port.ReadExisting().Length;
            byte[] data = new byte[byteArrayLength];

            for (int i = 0; i < 5; i++)
            {
                data[i] = Convert.ToByte(port.ReadByte());
            }
            string hexcode = BitConverter.ToString(data);

Zwar werden mir nun Hexzahlen angezeigt, allerdings ist der Code total unperformant. Gibt es da evtl. Möglichkeiten zur Performanceverbesserung?
Weil so ist das unmöglich zu gebrauchen. Das dauert mindestens 10 Sekunden wenn nicht sogar noch länger, bis etwas angezeigt wird.

LG Samuel

T
708 Beiträge seit 2008
vor 14 Jahren

Hi,

also ich habe das wie folgt gelöst:
(Der Code stammt zum teil von Dreamin Code, zum Teil auch aus anderen Quellen die ich leider nicht mehr alle nachvollziehen kann)

void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            switch (CurrentTransmissionType)
            {
                case TransmissionType.Text:
                    //read data waiting in the buffer
                    string msg = comPort.ReadExisting();
                    //display the data to the user
                    DisplayData(MessageType.Incoming, msg);
                    break;
                case TransmissionType.Hex:
                    int bytes = comPort.BytesToRead;
                    byte[] comBuffer = new byte[bytes];
                    comPort.Read(comBuffer, 0, bytes);
                    //display the data to the user
                    DisplayData(MessageType.Incoming, ByteToHex(comBuffer));
                    break;
                default:
                    string str = comPort.ReadExisting();
                    //display the data to the user
                    DisplayData(MessageType.Incoming, str);
                    break;
            }
        }

Die Funktionen machen dann dies:


private string ByteToHex(byte[] comByte)
        {
            StringBuilder builder = new StringBuilder(comByte.Length * 3);
            foreach (byte data in comByte)
                //convert the byte to a string and add to the stringbuilder
                builder.Append(Convert.ToString(data, 16).PadLeft(2, '0').PadRight(3, ' '));
            //remove last ' '
            builder.Remove(builder.Length - 1, 1);
            //return the converted value
            return builder.ToString().ToUpper();
        }

S
401 Beiträge seit 2008
vor 14 Jahren

Naja, du könntest mit einem char-Array und zwei Schleifen das ganze selbst implementieren. Dann sparst du dir das Kopieren in ein byte-Array

Ein bisschen Code


char[] str = { '0', '1', ...};
uint[] buf = port.Read();
uint t;

for(int i=0; i<buf.length; i++) {
   t = buf[i]

   for(int j=0; j<(32/2); j++) {
      stringBuilder.append(str[t & 0xF]);
      t >>= 2;
    }
}

//Edit: trib war schneller 😃

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren

Hallo

Vielen Dank für die Antwort.
Ich hab es nun wie folgt gelöst und es funktioniert wunderbar dank eurer Hilfe:

        private SerialPort port = new SerialPort("COM2", 38400, Parity.None, 8, StopBits.One);

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int value;
            port.Encoding = Encoding.UTF8;

            int byteArrayLength = port.BytesToRead;
            byte[] data = new byte[byteArrayLength];

            for (int i = 0; i < byteArrayLength; i++)
            {
                data[i] = Convert.ToByte(port.ReadByte());
            }

            string hexValues = BitConverter.ToString(data, 0);
            string[] hexValuesSplit = hexValues.Split('-');
            string Accesscode = "";

            foreach (String hex in hexValuesSplit)
            {
                value = Convert.ToInt32(hex, 16);
                Accesscode += Char.ConvertFromUtf32(value);
            }
        }

LG Samuel

U
1.688 Beiträge seit 2007
vor 14 Jahren

Ich hab es nun wie folgt gelöst

Du wandelst also gelesene Integer in Byte (ohne casting wohlgemerkt), ein Array dieser Bytes in einen Hexstring, welcher 2-Byte-weise erst in einen Integer und dann in ein Char gewandelt und schließlich an einen String angehängt wird?
Das sollte aber einfacher gehen. Leider hast Du noch nichts über die tatsächlich empfangenen Daten (s.o.) geschrieben. Aber wenn Du so zufrieden bist, dann ist's eben so.

185 Beiträge seit 2005
vor 14 Jahren

Ich kann nur sagen:

von hinten durch die Brust ins Auge 😁

D
Doltsche Themenstarter:in
249 Beiträge seit 2009
vor 14 Jahren

Ich kann nur sagen:

von hinten durch die Brust ins Auge 😄

xDDDD

Hallo zusammen

Na ja, vieleicht hat mir ja jemand einen Vorschlag wie ich es evtl etwas besser machen könnte.
Das Ergebnis der Funktion ist ist eine sechsstellige zahl, bzw. die letzten sechs stellen einer 14 stelligen Zahl.
Hinein kommt ein Bytestream, den ich dann in hexadezimale Werte umwandle.

LG Samuel