-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Com1 mit C

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.10.2004
    Ort
    Bad Harzburg
    Alter
    29
    Beiträge
    302

    Com1 mit C

    Anzeige

    Hallo,

    ich bin auf der verzweifelten Suche nach einer Möglichkeit den Com1 von mein PC zu proggen. ich möchte nur drei byte über ihn an ein servoboard senden, aber leider finde ich nichts wie man das realiesieren könnte. Ich haffe ihr könnt mir weiterhelfen.

    MfG Jan.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    guck mal hier (nur den code):
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=32523

    gruesse

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.10.2004
    Ort
    Bad Harzburg
    Alter
    29
    Beiträge
    302
    Danke für eure schnelle unt gute Wieterhilfe!!!

    Die beiden Seiten hab ich leider nicht gefunden.. ist mir schon fast peinlich das ich gefragt habe.

    Habe trotzdem noch ein paar fragen:

    Auf der Wiki Seite fehlen irgendwie die lib die man einfügen muss damit man die Funktionen überhaupt benutzen kann und ich weiß leider nicht wechle es sind (also z.b. die #include<stdio.h>) oder musss man das wie bei dem BCC dardrüber machen?
    außerdem irritiert mich die funktion zum senden von Bytes.

    WriteFile(hFile, Buffer, Count, &dwCount, 0);

    hFile bekommt er oben aus der anderen Funktion,
    Buffer sind die zu sendenen Daten,
    Count die max. Anzahl der zu sendenen Byte`s,
    dwCount die tatsächlich gesendeten Byte`s,

    So ich möchte drei zahlen über den Port senden und nun komm ich mit der Funktion zum senden durcheinander:

    Also ich vermute das ich dann in Count = 3 setzen muss weil ich drei Byte senden wil, aber wo schreibe ich jetzt meine Zahlen rein die ich senden will? In Buffer kann ich doch nur eine zahl schreiben oder ist das ein Array? Und woher soll ich vorher wissen wieviel Bytes er wirklich sendet (dwCount)?

    Bei dem Code von Robocat sieht das ja auch wieder ganz anders aus.

    Wenn ich es richtig verstanden habe ist das der Teil wo du Zahlen sendest die du als ASCII-Code interpretierst und dir so ein Wort "bastelst":

    sprintf(string,"%c%c%c%c%c",255,86,120,120,86);

    Und ich verstehe nicht ganz was du in der while-schleife machst. Ich vermute das du da (weil run = 1) endlos Daten liest und die dann auf dem Bildschirm ausgibts. Lieg ich da riechtig?

    Leider kann ich noch nicht ausprobieren ob ich es richtig verstehe da meine Bestellung noch nicht da ist.....

    MfG Jan

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oratus sum
    Registriert seit
    25.12.2006
    Ort
    Wien
    Alter
    26
    Beiträge
    1.079
    Blog-Einträge
    1
    Nimm doch einfach ein Terminalporgramm. Wieso rackerst du dich damit ab?

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.10.2004
    Ort
    Bad Harzburg
    Alter
    29
    Beiträge
    302
    Ich galube das ich ein Terminalprogramm nicht benutzen kann, weil ich die werte die gesendet werden sollen erst unter einem C-Programm ausgerechnet werden. Ich möchte über den Port ein Servocontroalboard ansteuern welches ein kleinen Roboterarm steuert und die inverse-kinematik ist halt in C geschrieben. Brauchte also eine lösung wie ich die Werte dann in das servoboard bekomme vom PC und was ich eben auf die schnelle zu Terminalprogramme gefunden habe, war das man die werte selber eingeben muss.
    Wenn das auch anders geht sag mir bitte wie, da ich davon null Ahnung habe.

    MfG Jan

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Auf der Wiki Seite fehlen irgendwie die lib...
    es sind windows api funktionen, man muss also windows.h einbinden.
    ...woher soll ich vorher wissen wieviel Bytes er wirklich sendet (dwCount)?
    dwCount wird von der funktion "ausgefüllt". man kann damit prüfen, ob wirklich alle bytes versendet worden sind.
    sprintf(string,"%c%c%c%c%c",255,86,120,120,86);
    string ist ein char array, das mit sprintf gefüllt wird. genauso würdest du deine 3 bytes da reinschreiben und versenden. es ginge natürlich auch string[0]=65; um den bytewert 65 (ASCII "A") an die erste stelle im array zu schreiben.
    Und ich verstehe nicht ganz was du in der while-schleife machst. Ich vermute das du da (weil run = 1) endlos Daten liest und die dann auf dem Bildschirm ausgibts. Lieg ich da riechtig?
    genau, da werden endlos einzelne bytes gelesen und ausgegeben. wenn du nur daten senden willst, braucht dich das erstmal nicht zu kümmern.

    um mit der seriellen schnittstelle schon ein wenig spielen zu können, könntest du hinten am PC rx und tx verbinden. wenn man daten sendet, sollte man sie dann sofort wieder einlesen können.

    wenn du mehr zu windows api funktionen wissen willst, solltest du dir eine api referenz (zB hier http://win32assembly.online.fr/files/win32api.zip) besorgen. oder du guckst immer auf die microsoft msdn seite.

    gruesse von der katz

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.10.2004
    Ort
    Bad Harzburg
    Alter
    29
    Beiträge
    302
    Hallo robocat,

    ich habe mal ein bischen mit dein C-Code rumgespielt und bin auf einige Probleme gestoßen, aber erstmal hier wie er jetzt bei mir aussieht:

    Code:
    // free code for reading gns9810 gps mouse attached to COM1 port done by robocat
    // compiler: bcc32, platform: xp
    
    #include <stdio.h>
    #include <windows.h>
    
    
    int main(void)
    {
      HANDLE port;
      DCB dcb;
      unsigned long dwNum;
      unsigned char c, string[6];
    
      port=CreateFile("COM1", // hier com-port einstellen
                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      0,
                      NULL);       // serielle Schnittstelle öffnen
    
      if(!port)
      {
        printf("failed to open port!\n");
        getch();
        exit(1);
      }
    
      if(!GetCommState(port, &dcb))
      {
        CloseHandle(port);
        printf("failed to get port!\n");
        getch();
        exit(1);
      }
    
      dcb.DCBlength=sizeof(dcb);
      dcb.BaudRate = CBR_38400;     
      dcb.ByteSize = 8;            // 8 Datenbits
      dcb.Parity = 0;              // kein Paritätsbit
      dcb.StopBits = ONESTOPBIT;   // 1 Stoppbit
      dcb.fBinary = TRUE;
      dcb.fParity = 0;
      dcb.fNull=TRUE;
    
      if(!SetCommState(port, &dcb))
      {
        CloseHandle(port);
        printf("failed to set port!\n");
        getch();
        exit(1);
      }
    
      sprintf(string,"%c%c%c%c%c",255,86,120,120,86);
      if(WriteFile(port,string,5,&dwNum,NULL))printf("init ok!\n");
    
      while(run)
      {
        ReadFile(port,&c,1,&dwNum,NULL);
        printf("%c",c);
        
      }
    
      CloseHandle(port);           // serielle Schnittstelle schließen
      return(0);
    }
    Wenn ich diesen nun laufenlasse mit verbundener RxD und TxD Leitung kommen nicht wie ich dachte die zahlen 255,86,120,120,86, sonder immer nur die ganze zeit "V". Dann dachte ich das das an dem %c liegen muss und habe es durch ein %i ersetzt damit er die zahlen auch als zahlen immt und es kam nur "ö".
    Jetzt weiß ich nicht wie ich da meine zahlen senden soll für das Micro-Servoboard von Robotikhardware.

    kannst du mir vll nochmal weiterhelfen?

    MfG Jan

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    43
    Beiträge
    1.517
    Warum sprintf ?

    Code:
    BYTE* Buffer = new BYTE[5];
    Buffer = [55,86,120,120,86];
    if(WriteFile(port,Buffer,5,&dwNum,NULL))
    {
           if(dwNum == 5)
           {
                  // Alle Bytes geschrieben
           }
    }
    Nach dem Init würde ich das noch machen

    // Puffer leer mach was da jetzt drin ist sollte schrott sein
    PurgeComm(port,PURGE_TXCLEAR);
    PurgeComm(port,PURGE_RXCLEAR);

    @robocat
    Liest du die GPS Mouse über das NEMA Protoll aus ?
    Wenn ja wie fägst du das Hüpfen der Geopos bei stand ab ?

    Gruß
    Home
    P: Meine Tochter (06.11.07) und Link
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    @Devil:
    das mit den verbundenen tx und rx leitungen habe ich selbst noch nicht ausprobiert. kann also leider nichts dazu sagen.

    @NumberFive:
    stimmt, es geht ohne sprintf kürzer und eleganter. da war ich wohl blind auf allen augen bzw habe meine c grundlagen nicht ordentlich gelernt. danke für den hinweis.
    die maus lese ich zwar über nmea mit einem alten psion handheld aus, lasse aber die koordinaten so wie sie sind. je nach satellitenzahl variiert die position um bis zu einige meter, aber um notfalls einen geocache zu heben, reicht es eigentlich aus. man könnte einen mittelwert aus 2-3 messungen bilden. war es das, was du gemeint hast?

    gruesse

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •