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
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
Wie kann ich das in C# erreichen?
Was denn? Es sind mehr Details nötig: was machst Du, was bekommst Du, was willst Du?
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
Hallo,
was steht denn in "data", bevor es in die RichtextBox geschrieben wird?
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.
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
Anzeige der Datenbytes als Hex-Folge:
BitConverter.ToString(data);
Du solltest dir die Daten aber nicht als string holen, sondern als Byte-Array.
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
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();
}
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 😃
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
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.
Ich kann nur sagen:
von hinten durch die Brust ins Auge 😁
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