Fernbedienung
-
Hmm, serielle Schnittstelle würd ich nicht mit inp/outp machen, lieber mit der DCB Struktur. Du musst auf jeden Fall die Schnittstellenparameter kennen, also Baudrate, Parität, Start/Stopp bit...
HANDLE hComPort; int ComPortInit(char* cPort,int BaudRate,unsigned char DataBits,short Parity,unsigned char Stopbits) { BOOL Status; COMMTIMEOUTS ctmoComPort; DCB dcbComPort; unsigned long ulWrittenBytes = 0; hComPort = CreateFile(cPort,GENERIC_READ | GENERIC_WRITE,NULL, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(hComPort != INVALID_HANDLE_VALUE) { memset(&ctmoComPort,0,sizeof(COMMTIMEOUTS)); ctmoComPort.ReadIntervalTimeout = 10; ctmoComPort.ReadTotalTimeoutConstant = 10; ctmoComPort.ReadTotalTimeoutMultiplier = 0; ctmoComPort.WriteTotalTimeoutConstant = 0; ctmoComPort.WriteTotalTimeoutMultiplier = 0; SetCommTimeouts(hComPort,&ctmoComPort); dcbComPort.DCBlength = sizeof(DCB); GetCommState(hComPort,&dcbComPort); dcbComPort.BaudRate = BaudRate; dcbComPort.ByteSize = DataBits; dcbComPort.fParity = Parity; dcbComPort.StopBits = Stopbits; SetCommState(hComPort,&dcbComPort); Status = 1; } else { printf("Schnittstelle nicht geöffnet :-(\n"); Status = 0; } return Status; // Status der Schnittstelle zurückgeben }
im Main:
ComPortInit("COM2",19200,8,NOPARITY,ONESTOPBIT);
Ok??
MfG Torsten
-
Wie man die COM-Schnittstelle anspricht kannst du in der FAQ nachlesen. Da stehen sogar zwei Möglichkeiten. Einmal rein für DOS-Anwendungen (16 Bit) in C und einmal für Windows (32 Bit) bzw. Konsole in C++.
Wie du jedoch die Fernbedienung ansprechen musst, um Daten zu kriegen, das musst du selber rausfinden. Vielleicht gibt es einen Befehlssatz oder eine Anleitung auf der Homepage vom Hersteller. Ansonsten www.google.de
-
Also, das mit dieser DCB Struktur funktioniert bei mir nicht.. Mein Compiler gibt mir da 15 Errors (sowohl als 16 bit Anwendung als auch 32 bit (Konsole)). Mit Windows kenn ich mich leider noch nicht so aus..
Ich habe derzeit..
#include <stdio.h> #include <stdlib.h> #include <dos.h> #include <conio.h> #include <string.h> #include <windows.h> #include <io.h>
.. eingebunden! Muss ich vielleicht noch ein paar einbinden?
-
Hui,
also ich hab#include "stdafx.h" #include "windows.h" #include "stdio.h" #include "conio.h"
drin, damit klappts auf jeden fall (unter VC6)
was kommen da genau für fehler?stdio und conio sind hier nur für printf´s...
-
Kleiner Nachtrag: Das sagt Microsoft dazu:
/* A sample program to illustrate setting up a serial port. */
#include <windows.h> int main(int argc, char *argv[]) { DCB dcb; HANDLE hCom; BOOL fSuccess; char *pcCommPort = "COM2"; hCom = CreateFile( pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, // must be opened with exclusive-access NULL, // no security attributes OPEN_EXISTING, // must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom == INVALID_HANDLE_VALUE) { // Handle the error. printf ("CreateFile failed with error %d.\n", GetLastError()); return (1); } // Build on the current configuration, and skip setting the size // of the input and output buffers with SetupComm. fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. printf ("GetCommState failed with error %d.\n", GetLastError()); return (2); } // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit. dcb.BaudRate = CBR_57600; // set the baud rate dcb.ByteSize = 8; // data size, xmit, and rcv dcb.Parity = NOPARITY; // no parity bit dcb.StopBits = ONESTOPBIT; // one stop bit fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. printf ("SetCommState failed with error %d.\n", GetLastError()); return (3); } printf ("Serial port %s successfully reconfigured.\n", pcCommPort); return (0); }
-
@Dago
Also nochmal. Es gibt in der FAQ schon was ausprogrammiertes für die Schnittstellen. Du musst dich dann nur noch um das Empfangen und Senden von Daten kümmern, also was du an die Fernbedienung sendest und was du von ihr empfängst.Link Serielle Schnittstellen unter 16 Bit (C): http://www.c-plusplus.net/forum/viewtopic.php?t=45173
Link Serielle Schnittstellen unter 32 Bit (C++; Klasse): http://www.c-plusplus.net/forum/viewtopic.php?t=39312
-
Ich benutze Borland C++ 4.5 (ist scho 'n bissle älter) bei mir kommen folgende Fehler, wenn ich den Code von der FAQ benutze:
Cannot convert 'void (interrupt *)(...)' to 'void (interrupt *)()' int function initinterrupt(char)
und davon ca. 20 Stück...
Und bei der Version von ThorstenM kommen ..
Undefined symbol 'COMMTIMEOUTS' ...
Statemend missing ; in function ComPortInit ...
Call to undefined function 'Create File' ...
...Die Fehler kann ich irgendwie nicht verbessern. Ich kann das ';' hinzufügen, dann kommen aber neue Fehler...
-
Hmm, da bin ich auch überfragt, wahrscheinlich ist mein Code Visual C spezifisch. Hab das auch schon mal irgendwie in Borland C gemacht. Muss ich mal den Code raussuchen.
Bis dann
MfG Torsten
-
@Dago
Verwende mal die Klasse im Thread "Ströme lenken" (der zweite Link, den ich dir gepostet hab), vielleicht funktionierts damit. Wenn du Fragen zur Verwendung der Klasse hast, dann frag mich einfach.Hast du beim Projekt auch 16Bit EXE-File ausgewählt?
PS: Und wichtig ist auch, dass der C-Compiler für die comport.c ausgewählt ist und nicht der CPP-Compiler!
-
@AJ
Die Klasse funktioniert bei mir jetzt. Ich habe sie schon einmal compilieren wollen, da ging es aber nicht, weil meine Compiler nur BOOL und TRUE, ... anstatt bool und true, ... erkennt.Naja, danke auf jeden Fall.
Hab jetzt halt keine Ahnung was ich mit TXD, RTS, ... anfangen soll. Kriege ich aber bestimmt bald raus.. (hoffe ich
)
Ich habs es jetzt unter Win32 (Konsole) compiliert.
-
TXD, RTS usw. sind die Leitungen bzw. Pins der seriellen Schnittstelle. Such einfach mal in google nach RS232 Schnittstelle dann findest du sicher was. Auf meiner Homepage hab ich auch ne kleine Tabelle.
Aber normalerweise musst du dich um das Zeugs nicht kümmern, sondern einfach Kommandos an ein Gerät schicken und dann die Antwort(en) empfangen.
-
Hi Leuts...
Wie man sieht, habe ich mich jetzt registriert
Naja, kann mir vielleicht mal irgendjemand einen Beispiel Code geben, wie ich speziell die Fernbedienung (COM1) ansprechen könnte... Falls keiner eine Idee hat, wie das gehen sollte, vielleicht einfach mal ein kleines Programm, das ein Modem anspricht (über COM2).
Thx @ Dago
-
Bei mir funzt der Quellcode nich !
Sagt immer das::**Kompilierung läuft...
sxf.cpp
c:\dokumente und einstellungen\geht euch nix an\desktop\neuer ordner\sxf.cpp(3) : fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'comports.h': No such file or directory
Fehler beim Ausführen von cl.exe.sxf.exe - 1 Fehler, 0 Warnung(en)**
Ich Benutze den Visual C++ 6.0 Compiler
Habe auch zig andere Quelltexte probiert da kommt immer so ne ähnliche Fehlermeldung! bitte HELP
-
1. Wie includierst du die comport.h
2. Liegt die comport.h auch im gleichen Verzeichnis?
3. Liegt ebenfalls die comport.c im Verzeichnis?
4. Ist die comport.c deinen Projektdateien beigefügt?
5. Ist für die comport.c nur der C-Compiler ausgewählt (wobei ich fast bezweifle, dass das beim MSVC möglich ist)
6. Wird deine Exedatei für ein 16Bit-System compiliert? (Soviel ich weiß, kann das der MSVC gar nicht)Vielleicht wäre es besser, wenn du die Klasse aus dem zweiten Link für 32Bit Anwendungen verwendest. Die Dateien heißen dann cport.c und cport.h. Dafür gelten dann natürlich die Punkte 5 und 6 nicht ;).