-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: serielle Schnittstelle

  1. #1
    Devil Ray
    Gast

    serielle Schnittstelle

    Hallo, ich möchte durch ein C++ Programm über die serielle Schnittstelle kommunizieren. Wie kann ich diesen Port öffnen und darauf zugreifen bzw. abfragen?
    Ich möchte auf einer Platine an einen definierten Port einen bestimmten Wert senden. Wie schreibe ich das in C? Weiß da jemand was oder kennt ein paar gute Links?

  2. #2
    Gast
    Entweder hier Forensuche (da laufen noch Diskussionen) oder auf www.mikrocontroller.net das Forum PC-Programmierung.
    Unterm Strich kommt bei allen Sachen raus, dass es keine einfache Lösung gibt und man schon etwas tiefergehende Programmierkenntnisse haben sollte.

    Gruss, Alex

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Code:
    // DOS32-Programm zum Senden eines Bytes über COM1 (9600-8N1)
    // OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
    // Note: Keine Fehlerbehandlung implementiert!
    #include <windows.h>
    
    int main (void)
    {
    	DCB           dcb;    
    	DWORD         iBytesWritten;
    	unsigned char ucMsg = 'C';    // zu sendendes Zeichen
    
    	HANDLE hCom = CreateFile ("COM1", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);                     
    	
    	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
    	GetCommState (hCom, &dcb);    // COM-Einstellungen holen und aendern
    	dcb.BaudRate  = 9600;         // Baudrate
    	dcb.ByteSize  = 8;            // Datenbits
    	dcb.Parity    = NOPARITY;     // Parität
    	dcb.StopBits  = ONESTOPBIT;   // Stopbits
    	SetCommState (hCom, &dcb);    // COM-Einstellungen speichern
    	
    	WriteFile (hCom, &ucMsg, 1, &iBytesWritten, NULL); // Senden eines Bytes
    	
    	CloseHandle (hCom); // COM1 schließen
    	
    	return (0);
    }
    Blackbird

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Hessibaby
    Registriert seit
    20.11.2003
    Ort
    Gelsenkirchen
    Alter
    64
    Beiträge
    1.597
    Hi Devil Ray,

    leider ist es seit WIN NT4.0 nicht mehr ganz so trivial direct auf eine Schnittstelle zuzugreifen da die Resourcen vom Betriebssystem per DLL-Function Call verwaltet werden. In einem DOS-Fenster geht´s da hier alle betriebssysteminternen Sicherheitsmechanismen ausgehebelt werden. Die entsprechenden DLL-Einsprungpunkte für Serviceroutinen sind in einigen Foren dokumentiert. Du hast allerdings die Möglichkeit z.B. auf Hyperterm aufzusetzen.

    Gruß Hartmut

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    @Hessibaby,
    weißt Du auch, wovon Du schreibst?

    Die altbekannten Funktionen inport(...) und outport(...) funktionieren nur unter 16Bit-OS wie eben DOS, Win3.1 und unter W95 und W98, W98SE. Die "neuen" Funktionen (siehe Code-Beispiel) sind ab W95 aufwärts bis zum letzten aktuellen OS, einschließlich der darauf laufenden DOS32-Box vorgesehen.
    Das in einem Dos(32)-Fenster in WinNT, Win2000 oder WinXP die "betriebssysteminternen Sicherheitsmechanismen ausgehebelt " werden ist Quatsch.

    Der Zugriff auf die seriellen Ports ist unter WinNT, Win2000 oder WinXP genauso einfach wie unter DOS. Komplizierter wird es erst, wenn die Zugriffe interruptgesteuert und im Hintergrund laufen. Aber das war unter DOS auch nicht einfacher.

    Blackbird

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Hessibaby
    Registriert seit
    20.11.2003
    Ort
    Gelsenkirchen
    Alter
    64
    Beiträge
    1.597
    Hi Blackbird,

    wenn Du meinst. OK. Aber lösche mal in einem DOS Fenster eine Datei und schau anschließend mal ob Du diese im Papierkorb wiederfindest.
    Die Im-/Export-funktionen greifen auf die zugeordneten DLL´s zu. Und anders geht´s auch nicht weil sonst das ganze Taskmanagment auf den Bauch fällt -da kommen auch die geliebten Blue-Screens her.

    Gruß Hartmut

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Das "DOS-Fenster" unter W95, W98 (und WinME?) hat noch den Direktzugriff auf das "unter" dem Windows liegende DOS. Und nur da umgeht es also die W95++ -"Schutzmechanismen".
    Aber unter WinNT aufwärts ist das DOS32-Fenster nur ein Windowsprogramm wie alle anderen auch. Und es bedient sich auch der gleichen Funktionen, DLLs, Treiber, etc. Deshalb funktionieren ja auch von dort die Portzugriffe, nicht nur in einem Windowsprogramm.

    Was ich mit dem Beispielcode zeigen wollte, war die einfach Ansteuerung von seriellen Ports unter ("geschützten") W32-Systemen, die aber auch unter den alten Windows-OS funktioniert. Als "Rahmen" habe ich das Consolenprogramm mit int main (void) {} gewählt, weil ein Windowsprogramm zu viel (verwirrenden) overhead hat. Geht aber genauso, den Code kann ich auch noch posten, ist aber viel länger.

    Die SerialPort-Ansteuerung ist von MS in den Compilerhilfen nicht besonders hervorgehoben und etwas tricky. Deshalb haben eine Reihe Programmierer diese Funktionen in einem Treiber, einer DLL zusammengefaßt und veröffentlicht. Kann man auch benutzen, warum nicht? Programmieren muß man aber trotzdem noch, da kann man auch die paar Zeilen Code selber schreiben, wenn man nicht den vollen Funktionsumfang braucht.

    Blackbird

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    42
    Beiträge
    1.517
    Hallo,

    Blackbird du hast recht dein Code tut ob alles Dosfenster und als windows prg. Nur das man mit den Code nur schreiben kann und nix empfangen.
    Wenn man mit so code empfangen will muß man leider ein thread bauen.
    da son zeichen verloren gehen.

    Das einzige was ich noch ein bauen würde ist Purgecom um bei starten den serial buffer zu löschen. Irgenwo hier im forum hatte ich mal den Source gepostet aber ich finde ihn nicht wieder war für VC 6 und ATL

    ach jetzt habe ich es doch gefunden

    http://www.roboternetz.de/phpBB2/viewtopic.php?t=1259

    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

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    @NumberFive;

    die Frage war:
    Ich möchte auf einer Platine an einen definierten Port einen bestimmten Wert senden. Wie schreibe ich das in C?
    Buffer löschen und Schnittstelle zurücksetzten (CLRDTR) fehlen genauso wie das Abfangen von Fehlern.

    Ich gehe aber mal davon aus, dass @Devil Ray programmieren kann.

    Bytes empfangen sollte man immer in einem eigenen Thread. Das funktioniert dann auch ab W95 aufwärts. Damit sich nichts stört, öffnet man die COM-Schnittstelle noch im Modus OVERLAPPED.

    Blackbird

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    42
    Beiträge
    1.517
    Ok hab dann dasvielleicht was mis verstanden.

    Auf ein port zuzugreifen geht aber auch.Im ddk von ms gibt es ein beispiel
    damit kann mann sich port adressen blockieren(als treiber installiert makieren) dann kann aus ein prg auf den treiber direckt zu greifen und daten an die adresse schreiben. Habe im mal programmiern für die Paralle schnistelle um ein lauf licht zu bauen. also wenn so gesucht wird kann ich mit source und programm dienen also aber für c++ von ms.

    Nachteil dieser metode man kann die Paralle schnistelle nicht mehr im normalen windows verwenden. installation ist nicht gar so einfach.

    Gruß Numberfive
    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

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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