Hallo liebe Forenmitglieder!
Seit gut 3 Tagen bin ich für mein Praktikum damit beschäftigt,
ein Gerät, welches auf Basis eines FTDI-USB-Chips via UART
ausgelesen/gesteuert werden kann, mit C# (und der entsprechenden
C#-FTDI-Bibliothek) eine universal-Gerätesoftware zu schreiben.
Da ich jedoch in C# nur Grundkenntnisse besitze und mit der FTDI Serie
auch noch nie gearbeitet habe, ist dies für mich eigentlich alles noch
"Neuland".
Die Serienummer des Gerätes konnte ich mal schon auslesen und auch die
Anzahl der angeschlossenen Geräte ermitteln.
Durch senden eines definierten ASCII-Strings via UART,
sollten anschließend die Daten aus dem Gerät ausgelesen werden.
Folgende Routine habe ich bisher programmiert,
und habe einen Bit-Stream erhalten,
bei welchen ich jedoch nicht weis,
wie ich diesen in C# als ASCII-Zeichen interpretieren lassen kann.
(Die Zeichen sollen übrigends zeilenweise eingelesen werden,
da das Gerät dies als Klartext an den PC sendet,
newline = <CR>+<LF>):
Die serielle Schnittstelle besitzt folgende Parameter:
Baudrate: 300
Datenbits: 7
Stopbit: 1
Parity: Even
new String:<CR>+<LF>
Hat jemand denn vielleicht eine Idee bzw. "Quellcode-Schnipsel",
wie ich dies realisieren kann?
Vielen dank bereits im Vorraus :-D
Hallo Detlevt!
Da ich wie gesagt noch ein C#-Anfänger bin, kann es sein,
dass folgende Frage vielleicht doof ist, aber:
Wie benutzt man einen virtuellen COM-Port in C#?
... meinst du also, den Chip einfach als USB-seriell-Wandler zu
betrachten und anschließend mit einer "nicht FTDI-Bibliothek"
auszulesen?
Wenn ja, kann man da dann auch die Baudrate umstellen?!
lg
Wenn du schon soweit mit der FTDI Klasse bist, dann macht es keinen sinn
es über den virtuellen-Com port zu machen, die umwandlung er Zahlen ist
immer die gleiche.
Aber du sagst leider nicht was nicht geht? Steht denn in received etwas
sinnvolles drin? Schau doch einfach mal im Debugger nach.
Hallo PeterII!
Du meinst also, dass ich weiterhin mit der FTDI-Klasse arbeiten soll?
... das Problem ist eigentlich, dass ich nicht weiß, wie ich die binären
Daten in C# in ein ASCII-Zeichen konvertiere :-(
lg
UInt32recdata=0;// Variable für empfangene Daten definieren
2
UInt32numBytesWritten=0;
3
4
recdata=Convert.ToUInt32(numBytesWritten);
5
6
returnrecdata;// empfangene Daten zurückgeben
ich kann zwar kein c#, aber das ergibt für mich einfach keinen Sinn.
ben91 schrieb:> Da ich jedoch in C# nur Grundkenntnisse besitze und mit der FTDI Serie> auch noch nie gearbeitet habe, ist dies für mich eigentlich alles noch> "Neuland".
Mir haben in solchen Situationen immer Beispiele geholfen. Also such mal
nach einem ordentlichen Beispiel und denke solange darüber nach bis du
es Verstanden hast.
Hallo PeterII!
Danke erstmal für deine Hilfe!
Ich habe jetzt mal versucht die Bits umzuwandeln.
Leider verstehe ich die FTDI-Empfangsroutine nicht mal,
und weiß deswegen auch nicht, wie ich das jetzt anstellen soll.
Bei der Konvertierung wird mir übrigends eine Fehlermeldubg angezeigt
(Fehler 1 Die beste Übereinstimmung für die überladene
System.Text.Encoding.GetString(byte[])-Methode hat einige ungültige
Argumente.
Fehler 2 1-Argument: Kann nicht von "uint" in "byte[]" konvertiert
werden.)
hier der Quellcode dazu:
1
privatestringread_from_device()// lese-Routine für FTDI-Chip
2
{
3
stringrecdata;// Variable für empfangene Daten definieren
4
UInt32numBytesWritten=0;// Variable für empfangene Bits definieren
5
UInt32numBytesToRead=0;// Variable für verfügbare Bits definieren
ben91 schrieb:> recdata = enc.GetString(numBytesWritten);
denk doch mal bitte darüber nach was das hier soll? Was könnte
"numBytesWritten" bedeuten? Eventuell "anzahl der Geschrieben bytes"
Also wirst du damit wohl NIE an die Daten kommen.
Die Daten stehen in received!
Hallo!
Erstmal danke für die ganzen Tips & Tricks!
Die Beispiele, wie auch das "Programmers Guide" von FTDI habe ich
bereits heruntergeladen & versucht zu verstehen.
Da ich, wie gesagt, nicht nur bei der Verwendung der FTDI-Bibliothek,
sondern auch in C# unerfahren bin,
ist dies für mich trotz super Beispiele eine Tortur,
etwas zu verstehen.
Verständnissfrage: was gibt die Funktion "myFtdiDevice.Read()" denn
jetzt eigentlich für Daten zurück ... einzelne Bytes @ 7 Bit,
welche ich in ein ASCII-Zeichen umwandeln muss (8 Bit?!)
oder sämtliche Bits, welche gerade empfangen werden?
vielen Dank :-)
ben91 schrieb:> Verständnissfrage: was gibt die Funktion "myFtdiDevice.Read()" denn> jetzt eigentlich für Daten zurück ... einzelne Bytes @ 7 Bit,> welche ich in ein ASCII-Zeichen umwandeln muss (8 Bit?!)> oder sämtliche Bits, welche gerade empfangen werden?
ich habe zwar keine Ahnung von FTDI aber das hier ist eigentlich
selbsterklärend
myFtdiDevice.Read(received, numBytesToRead, ref numBytesWritten);
received - hier landen die Gelesen Daten
numBytesToRead - anzahl der bytes die man lesen will
numBytesWritten - anzahl der gelesenen bytes
Und es sind immer 8bit - bytes. Auch wenn wenn du eine 7bit übertragung
machst.
ben91 schrieb:> Hallo PeterII!>> Danke erstmal für deine Hilfe!>> Ich habe jetzt mal versucht die Bits umzuwandeln.> Leider verstehe ich die FTDI-Empfangsroutine nicht mal,
Dein Problem ist, dass du dich nicht an den Wörtern orientierst. Ein gut
geschriebenes Beispiel ist wie ein Prosatext, bei dem man die Füllwörter
weglässt.
> string recdata; // Variable für empfangene Daten> definieren
soweit so gut. Wir wissen aber noch mehr. Das sind nicht einfach nur
Daten, sondern in dieser Variable sollen die Daten schon als String
hinein. Also bereits in Textform!
> UInt32 numBytesWritten = 0; // Variable für empfangene Bits> definieren
Schau. Das ist Unsinn. Das können nicht die empfangenen Bits sein. Die
Variable heißt
num offenbar eine Abkürzung. num ist meistens die Abkürzung
für das englische number. Also Anzahl
Bytes da ist von Bytes die Rede. Und nicht von Bits
Written ok, das ist ein wenig misverständlich. Denn hier geht
es nicht um das Schreiben auf den FTDI, sondern um das
Lesen.
Aus dem weiteren Quelltext geht aber hervor, dass dir hier
die eigentliche Lesefunktion angeben wird, wieviele Bytes
sie beim Leseversuch tatsächlich in dein Array geschrieben
hat.
Du forderst eine bestimmte Anzahl Bytes an, und die
Funktion sagt dir: soviele warens wirklich.
Das ist wie wenn du einkaufen gehst. Du sagst zum
Baumarkt-fachberater "Ich brauch 6 Rigips-Platten" und
er sagt "Ich hab aber nur 4"
Alles in allem zusammengenommen, ist daher deine Beschreibung für diese
Variable ziemlicher Mumpitz. Und das "definieren einer Variable" - spar
dir solche Kommentare. Jeder Programmierer kann sehen, dass es hier um
die Definition einer Variablen geht. Das brauchst du nicht komentieren.
Das ist so, wie wenn du sagst: Dieses weiße Pferd ist ein Schimmel. No,
na - was soll es sonst sein.
> // Verfügbare Bitanzahl abfragen> myFtdiDevice.GetRxBytesAvailable(ref numBytesToRead);
Genau. Deswegen heißt die Funktion ...BytesAvailable. Weil sie Bitzahl
*****
liefert.
> // Bits seriell auslesen> myFtdiDevice.Read(received, numBytesToRead, ref numBytesWritten);
Was wird hier wohl passieren. Ohne dass man die Funktion selber kennt
oder in der Doku nachschlägt. Was wird wohl logisch sein?
An das Objekt myFtdiDevice ergeht der Befehl "read". Was wird das Objekt
wohl dazu brauchen
es muss wissen, wieviele Bytes es eigentlich lesen soll
und es wäre schön, wenn sie darüber Auskunft geben würde, wieviele
Bytes sie tatsächlich gelesen hat. Diese Anzahl muss ja nicht
notwendigerweise mit der angeforderten übereinstimmen.
und es braucht natürlich eine Speicherfläche (die auch groß genug
sein muss), in der sie die gelesenen Daten (die Bytes) ablegen
kann
Welches der 3 Argumente wird wohl was sein? Die Namen der Argumente
helfen dir das zu identifizieren.
Also: einfach mal ein wenig den Kopf benutzen und überlegen,
was davon ist logisch
wie helfen mir und was erzählen mir die Variablen- und Funktionsnamen