Narf! Geschrieben 25. August 2003 Geschrieben 25. August 2003 Hallo Leute! Ich möchte einen COM-Port öffnen und möchte die Einstellungen, wie Bitrate selbst vornehmen. Wie geht das und muss ich das vor CREATEFILE oder danach machen?
Guybrush Threepwood Geschrieben 25. August 2003 Geschrieben 25. August 2003 Wenn ich mich recht erinnere kannst du das über die Funktion SetCommState() einstellen.
Narf! Geschrieben 29. August 2003 Autor Geschrieben 29. August 2003 Da sind ja 'ne ganze Menge Werte einzustellen. In der MSDN habe ich auch nicht so recht was gefunden, wo die Werte erklärt werden. Ich möchte den COM-Port so einstellen: Baudrate: 9600 Parität: keine Bitgröße: 8 Stopbit: 1 Flowcontrol: xon/xoff Ich habe das mit BuildCommDCB("9600,n,8,1", &dcb) probiert, bekomme aber einen Fehler "Unbehandelte Ausnahme".
Guybrush Threepwood Geschrieben 29. August 2003 Geschrieben 29. August 2003 Zeig mal den Rest des Codes
Narf! Geschrieben 1. September 2003 Autor Geschrieben 1. September 2003 Davor habe ich das COM-Port mit CreateFile("COM2", ...) geöffnet. DCB dcb; BuildCommDCB("9600,n,8,1", &dcb);
Klotzkopp Geschrieben 1. September 2003 Geschrieben 1. September 2003 Deine DCB-Struktur wird auf dem Stack angelegt, also ist sie zunächst mit zufälligen Werten gefüllt. Da BuildCommDCB nur die Werte in der Struktur setzt, die auch im String stehen, ist die Struktur danach immer noch ungültig. Füll zuerst mit GetCommState die Struktur mit den aktuellen Einstellungen der Schnittstelle, bevor du BuildCommDCB aufrufst, dann sollte das klappen.
Narf! Geschrieben 1. September 2003 Autor Geschrieben 1. September 2003 Das habe ich auch schon mit drinn: DCB dcb; GetCommState(hFile, &dcb); BuildCommState("9600,n,8,1",&dcb);
Klotzkopp Geschrieben 1. September 2003 Geschrieben 1. September 2003 Original geschrieben von Narf! BuildCommState("9600,n,8,1",&dcb); Ich nehme an, dass im "richtigen" Code BuildCommDCB steht. Bist du sicher (sprich: hast du mit dem Debugger geprüft), dass genau an dieser Stelle eine Exception auftritt, und nicht irgendwann später? Bei mir läuft das nämlich einwandfrei.
Narf! Geschrieben 2. September 2003 Autor Geschrieben 2. September 2003 Ups! Na klar steht da BuildCommDCB. Ja, an genau der Stelle kommt: "Unbehandelte Ausnahme in [Programm.exe] (Kernel32.dll): 0XC0000005: Access Violation." Kannst Du mir auch das Beispiel mit SetCommState geben?
Klotzkopp Geschrieben 2. September 2003 Geschrieben 2. September 2003 // ... HANDLE hSerial = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if( INVALID_HANDLE_VALUE == hSerial ) { return GetLastError(); } DCB dcb; if( !GetCommState( hSerial, &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } if( !BuildCommDCB( "9600,n,8,1", &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } if( !SetCommState( hSerial, &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } // ... [/CODE]
Narf! Geschrieben 2. September 2003 Autor Geschrieben 2. September 2003 Ich wollte eigentlich wissen, wo ich bei SetCommState die o.g. Werte eintragen soll.
Klotzkopp Geschrieben 2. September 2003 Geschrieben 2. September 2003 Original geschrieben von Narf! Ich wollte eigentlich wissen, wo ich bei SetCommState die o.g. Werte eintragen soll. Gar nicht. Wenn du nicht BuildCommDCB verwenden willst, musst du die Elemente der DCB-Struktur von Hand setzen: dcb.BaudRate = CBR_9600; dcb.fParity = FALSE; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; SetCommState musst du in beiden Fällen aufrufen.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden