C Programmierung - Serieller Port, Daten auslesen, im Graph darstellen



  • Hallo,
    erstmal stelle ich mich vor, bin ein Student und studiere Informatik. Arbeite gerade an einem Programm, um die empfangenen Daten von einem Laser zu empfangen und sie dann in einem Graphen darstellen zu lassen.

    Bin leider nicht sehr gut in programmierung mit C, hab eher mehr Erfahrung mit Java (leider).

    Deswegen würde ich mich über jegliche Hilfe sehr freuen.

    Erster Schritt: Serielle Schnitstelle ansprechen und Daten empfangen

    Ich hab schon ein lauffähiges Programm zum öffnen von von Seriellenschnitstellen gefunden. Ich kann den Seriellen Port aufmachen und schliessen, kriege auch Daten von dem Port in Form von ASCII-Zeichen.
    Was noch fehlt ist den Seriellen Port etwas schicken, da komme ich leider noch nicht so gut weiter. Also wenn jemand paar Ideen hat, bitte hier schreiben!!!

    Zweiter Schritt: Daten von ASCII-Zeichen nach DEZIMAL umwandeln

    Um später die wichtigen Daten in einer Tabelle sehen zu können, brauche ich keine ASCII-Zeichen, sondern die dazu gehörigen Wert als Dezimal-Zeichen. Ich habe da paar Wege versucht, aber das funktioniert irgendwie nicht.
    Ich würde mich sehr, über ein Beispiel wo ich sehen kann wie ich von ASCII-Zeichen, nach DEZIMAL kommen kann, freuen!!!

    Dritter Schritt: Punkte in einem Graphen anzeigen

    Nachdem ich die Dezimal-Zeichen habe, werde ich sie dann zu DOUBLE Werten umwandeln, welche ich dann in einem Graph anzeigen muss.

    -Es gibt eine X Achse, wo die Anzahl der angezeigten Werte gegeben ist.
    -Es gibt eine Y Achse, wo die Werte ausgegeben werden 0 bis maximal 10, die Werte sollen aber auch in Micrometern angezeigt werden, also mit der dazugehörigen Nachkommastelle.

    Ein beispiel zum Graphen wäre die größte Hilfe für mich, denn da kenn ich mich gar nichts aus!!!

    Ich bedanke mich schon mal im Vorrauss, wenn noch Fragen sind, mit dennen ich euch etwas besser beschreiben kann, wie ich das machen will, dann einfach hier Posten.

    Vielen Dank.
    Gruß
    GaanSan


  • Mod

    GaanSan schrieb:

    Erster Schritt: Serielle Schnitstelle ansprechen und Daten empfangen

    Ich hab schon ein lauffähiges Programm zum öffnen von von Seriellenschnitstellen gefunden. Ich kann den Seriellen Port aufmachen und schliessen, kriege auch Daten von dem Port in Form von ASCII-Zeichen.
    Was noch fehlt ist den Seriellen Port etwas schicken, da komme ich leider noch nicht so gut weiter. Also wenn jemand paar Ideen hat, bitte hier schreiben!!!

    Das geht über den normalen Sprachstandard von C hinaus, daher kann ich nur raten, wie du das gemacht hast. Zeig mal wie du von der seriellen Schnittstelle liest, dann kann man dir zeigen wie man mit den gleichen oder ähnlichen Mitteln schreibt.

    Zweiter Schritt: Daten von ASCII-Zeichen nach DEZIMAL umwandeln

    Um später die wichtigen Daten in einer Tabelle sehen zu können, brauche ich keine ASCII-Zeichen, sondern die dazu gehörigen Wert als Dezimal-Zeichen. Ich habe da paar Wege versucht, aber das funktioniert irgendwie nicht.
    Ich würde mich sehr, über ein Beispiel wo ich sehen kann wie ich von ASCII-Zeichen, nach DEZIMAL kommen kann, freuen!!!

    Was bitte ist ein Dezimalzeichen? 😕

    Versuch mal zu zeigen was du hast und was du willst. Und wie ich weiterlese willst du am Ende einen double-Wert. Erläutere doch mal, wozu dieser Zwischenschritt gut sein soll.

    Dritter Schritt: Punkte in einem Graphen anzeigen

    Nachdem ich die Dezimal-Zeichen habe, werde ich sie dann zu DOUBLE Werten umwandeln, welche ich dann in einem Graph anzeigen muss.

    -Es gibt eine X Achse, wo die Anzahl der angezeigten Werte gegeben ist.
    -Es gibt eine Y Achse, wo die Werte ausgegeben werden 0 bis maximal 10, die Werte sollen aber auch in Micrometern angezeigt werden, also mit der dazugehörigen Nachkommastelle.

    Ein beispiel zum Graphen wäre die größte Hilfe für mich, denn da kenn ich mich gar nichts aus!!!

    Was sind denn die konkreten Probleme? Das ist ein weites Feld. Wieder gilt, dass Zeichnen über den Sprachstandard hinausgeht, da müsste man konkreter wissen, welche Mittel man einsetzen kann. Ich empfehle aber eine fertige Plotbibliothek, damit du nicht das Rad zum 1000. Mal erfinden musst. Gnuplot hat glaube ich eine gute C-Anbindung.



  • GaanSan schrieb:

    Ich würde mich sehr, über ein Beispiel wo ich sehen kann wie ich von ASCII-Zeichen, nach DEZIMAL kommen kann, freuen!!!

    Ich drück bei den Ausrufezeichen mal ein Auge zu. Suchst du sowas wie man: strtol? Das nimmt einen String und macht eine Ganzzahl daraus. Oder hast du was anderes gemeint?

    Mit Standard C wird das mit der seriellen Schnittstelle und dem Graphen nichts werden, weil C weder einen seriellen Port, noch Grafikausgabe kennt. Das könntest du in dem jeweiligen OS- oder Framework-Forum nachfragen.



  • GaanSan schrieb:

    Arbeite gerade an einem Programm, um die empfangenen Daten von einem Laser zu empfangen und sie dann in einem Graphen darstellen zu lassen

    Was für ein Laser? (reine Neugier meinerseits 😃 )

    GaanSan schrieb:

    Bin leider nicht sehr gut in programmierung mit C, hab eher mehr Erfahrung mit Java (leider).

    Wenn du Programmiert hast und weißt wie man einem Computer etwas mitteilt sollte die Sprache kein so großes Problem mehr sein.

    GaanSan schrieb:

    Zweiter Schritt: Daten von ASCII-Zeichen nach DEZIMAL umwandeln

    Gib mal ein Beispiel von den Zeichen.



  • Hallo nochmal, danke für so schnelle Antworten 😃

    SeppJ schrieb:

    Das geht über den normalen Sprachstandard von C hinaus, daher kann ich nur raten, wie du das gemacht hast. Zeig mal wie du von der seriellen Schnittstelle liest, dann kann man dir zeigen wie man mit den gleichen oder ähnlichen Mitteln schreibt.

    Ich werde in einem späteren Post, den Quelltext des Programms mal hier reinposten. Im moment habe ich nicht die Möglichkeit, sorry.

    SeppJ schrieb:

    Was bitte ist ein Dezimalzeichen? 😕

    Versuch mal zu zeigen was du hast und was du willst. Und wie ich weiterlese willst du am Ende einen double-Wert. Erläutere doch mal, wozu dieser Zwischenschritt gut sein soll.

    Ich meine nur Dezimal. Ich kriege hex Werte, welche ich dann aber in dez Werte haben will. zB: hex = 3A und ich will daraus dez = 58 haben. Hoffe das hat zu dem verständniss geholfen 🙂
    Zu dem double Wert. Später habe ich eine Formel, in der ich mit diesen dez-Wert arbeite. zB: 200/dez-Wert - 102 = double . Double ist wichtig, weil Nachkommazahlen benötigt werden.

    SeppJ schrieb:

    Was sind denn die konkreten Probleme? Das ist ein weites Feld. Wieder gilt, dass Zeichnen über den Sprachstandard hinausgeht, da müsste man konkreter wissen, welche Mittel man einsetzen kann. Ich empfehle aber eine fertige Plotbibliothek, damit du nicht das Rad zum 1000. Mal erfinden musst. Gnuplot hat glaube ich eine gute C-Anbindung.

    hey danke das hört sich sehr vernünftig an, ich werde es mal versuchen, zuerst Daten empfangen und sie dann über Gnuplot anzeigen 🙂

    mngbd schrieb:

    Ich drück bei den Ausrufezeichen mal ein Auge zu. Suchst du sowas wie man: strtol? Das nimmt einen String und macht eine Ganzzahl daraus. Oder hast du was anderes gemeint?

    Sorry wegen den Ausrufezeichen, damit wollte ich nur sagen, das ich genau bei diesem Problem hilfe brauche, und nix anderes 🙂
    Wie ich schon oben bei SeppJ geschrieben habe, will ich aus einem hex-Wert ein dez-Wert haben. Beispiel siehe bitte oben. Danke.

    mngbd schrieb:

    Mit Standard C wird das mit der seriellen Schnittstelle und dem Graphen nichts werden, weil C weder einen seriellen Port, noch Grafikausgabe kennt. Das könntest du in dem jeweiligen OS- oder Framework-Forum nachfragen.

    Wenn man die <termio.h> oder <termios.h> nimmt, kann man schon mit Seriellen Port arbeiten kann. Wegen der Grafikausgabe weiss auch auch nichts genaueres.

    DirkB schrieb:

    Was für ein Laser? (reine Neugier meinerseits 😃 )

    LDS-70/20/232 Ist ein Laser Distanz Sensor. 🙂

    DirkB schrieb:

    Wenn du Programmiert hast und weißt wie man einem Computer etwas mitteilt sollte die Sprache kein so großes Problem mehr sein.

    Ist schon klar vieles ist auch nicht so schwer, aber wenn es um Serielle Ports geht oder um Anzeigen von etwas, da war ich noch nicht so gut 🙂

    DirkB schrieb:

    Gib mal ein Beispiel von den Zeichen.

    Siehe bitte Beispiel oben bei der Antwort zu SeppJ. Danke



  • Bei deinen Zeichen ist es wichtig zu wissen ob du ein Zeichen hast das 0x3A ist oder ob du 2 Zeichen '3' und 'A' empfängst!

    Das erste wäre die binäre Darstellung und dann kannst du damit normal rechnen. Denn ob da 0x3A oder 58 angezeigt wird hängt nur vom Format beim printf ab.

    Wenn du aber 2 Zeichen hast, dann liegen die als String vor und dann mußt du (wie schon geschrieben) strtol nehmen.

    Der Serielle Port und die Grafik sind sehr Systemabhängig, darum wäre es gut zu wissen auf welchem System (Windows/Linux)-Version du arbeitest.



  • Wie mngbd schon gesagt hat, kann man mit der Funktion strtol Hex in Dec wandeln.
    Beispiel von Frau Goggle:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main ()
    {
      char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
      char * pEnd;
      long int li1, li2, li3, li4;
      li1 = strtol (szNumbers,&pEnd,10);
      li2 = strtol (pEnd,&pEnd,16);
      li3 = strtol (pEnd,&pEnd,2);
      li4 = strtol (pEnd,NULL,0);
      printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
      return 0;
    }
    


  • GaanSan schrieb:

    Ich meine nur Dezimal. Ich kriege hex Werte, welche ich dann aber in dez Werte haben will. zB: hex = 3A und ich will daraus dez = 58 haben. Hoffe das hat zu dem verständniss geholfen 🙂

    Nö, gar nicht. Gespeichert werden alle Zahlen sowieso in Bits. Beschreib das bitte genauer. Bekommst du einen String "3A" als Eingabe?

    GaanSan schrieb:

    Wenn man die <termio.h> oder <termios.h> nimmt, kann man schon mit Seriellen Port arbeiten kann. Wegen der Grafikausgabe weiss auch auch nichts genaueres.

    Dergleichen kann ich im Standard nicht finden, das ist sicher was Unix-spezifisches. Du bist hier aber im Forum für Standard-C. Was das angeht, kannst du's hier versuchen:
    http://www.c-plusplus.net/forum/f5

    Nachtrag:
    Das Beharren auf dem Standard hier im Forum hat einige nette Effekte, z.B. dass hier keine OS-Flamewars aufkeimen können. Ist nichts persönliches. 🙂



  • Alles klar, trotzdem allen Danke, bin schon etwas weitergekommen. Man sieht sich.
    Cya

    PS: ich arbeite auf dem Ubuntu System, also Linux 🙂



  • Na dann noch viel Spaß. 🙂

    Für die Grafik kannst du dir mal gnuplut anschauen. Das kannst du auch von deinem Programm aus starten.

    Muss es denn C sein? Wenn du Java kennst, mach es damit. Sollte dann sogar portabel sein.

    Wenn du die Lösung hast kannst du sie ja mal hier schreiben.


Anmelden zum Antworten