Telefonansteuerung

excSchaKaL

Grünschnabel
hi
ich bin nich wirklich so gut in c++ und brauch ma hilfe
ich bekomm ständig fehlermeldungen ausgeschickt wenn ich was mach
also kann ich schlecht die fehlermeldungen hierhinschreiben da ich schon einige bekommen hab :)
mit dem programm will ich per pc das telefonsteuern können
also mit dem pc anrufen das ich nich am telefon tippen muss
ich will jetzt aber auch so machen das wenn ich "programmname.exe 84678" das er direkt die nr anrufen tut

vielleicht kann mir ja wer helfen ich verzweifel nur ^^
Code:
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#include <iomanip.h>
#include <conio.h>
#include <stdio.h>

HANDLE hCom1;

const int dwStateSendByteAvailable    = 1;
const int dwStateReceiveByteAvailable = 2;
const int dwStateRTS                  = 4;
const int dwStateCTS                  = 8;

const int dwSendByteOffset    = 16;
const int dwReceiveByteOffset = 24;

void PrintHeader( ostream &os )
{
    os << "                     RTS       CTS" << endl;
    os << "          Snd  Rcv  0   1     0   1" << endl;
}


BOOL gbPrintChangesOnly = FALSE;
DWORD gdwLastState = 0x0;

BOOL ReadByte( HANDLE hCom, BYTE &byRead )
{
    DWORD dwBytesRead = 0;
    ReadFile( hCom1,
              &byRead,
              1,
              &dwBytesRead,
              NULL );

    return (dwBytesRead == 1);

}


void Communicate()
{
    DWORD dwTickOffset = GetTickCount();
    while (1)
    {
        BYTE byRead = 0xaa;

       if (ReadByte(hCom1, byRead))
        {
			printf ("%c",byRead);
        }

        if (kbhit())
        {
			char anykey;
			DWORD BytesWritten;
			anykey = getch();
			
			printf ("%c",anykey);			

			WriteFile
			(
				hCom1,
				&anykey,
				1,
				&BytesWritten,
				NULL
			);
        } 
	}

    cout << "End Logging" << endl;

}

BOOL WriteData (const char *pDaten)
{
	printf ("%s", pDaten);
	BOOL a;
	return a;
}

BOOL isPhoneConnectet()
{
	WriteData ("AT");
	return 0;
}


BOOL Dial(char *pNumber)
{
	WriteData (pNumber);
	return 0;
}


int main(int argc, char *argv[])
{
	if (argv[1])
	{
		isPhoneConnectet ();
		return 0;
	}

	if (argv[2])
	{
		Dial(pNumber);
		printf ("%s", pDaten);
		return 0;
	}

    cout << "Hallo" << endl;

    if (argc==2 && 
        (strcmp(argv[1], "/C")==0 || strcmp(argv[1], "/c")==0))
    {
        cout << "  logging changes only" << endl;
        gbPrintChangesOnly = TRUE;
    }
    else
    {
        cout << "  use /C for logging changes only" << endl;
        gbPrintChangesOnly = FALSE;
    }

    hCom1 = CreateFile( "\\\\.\\COM1",
                     GENERIC_READ | GENERIC_WRITE, 
                     0, 
                     0, 
                     OPEN_EXISTING,
                     0,
                     0 );

    if (hCom1==INVALID_HANDLE_VALUE)
    {
        cout << "Cannot open COM1" << endl;
        exit(1);
    }



    DCB DCBInfo;
    memset( &DCBInfo, 0, sizeof(DCB) );
    DCBInfo.DCBlength = sizeof(DCB);
    DCBInfo.fBinary         = 1;
	DCBInfo.fDtrControl = 2;
	DCBInfo.fRtsControl = 0; 

    DCBInfo.BaudRate  = 1200;
    DCBInfo.ByteSize  = 8;
    DCBInfo.Parity = NOPARITY;;
    DCBInfo.StopBits = ONESTOPBIT;

    if (!SetCommState( hCom1, &DCBInfo ))
    {
        cout << "Cannot set parameters for COM1" << endl;
    }


    COMMTIMEOUTS timeouts;
    GetCommTimeouts( hCom1, &timeouts );
    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    SetCommTimeouts( hCom1, &timeouts );



    cout << "Press <Enter> to start and stop logging" << endl;
    cout << "Press <ESC> to quit logger" << endl;

    char c;
    do 
    {
        c = getch();
        if (c==13)
        {
            PrintHeader(cout);

            Communicate();
        }


    }
    while (c!=27);


	return 0;
}

ein danke an alle die mir helfen können oda es versucht haben *g*
 
excSchaKaL hat gesagt.:
ich will jetzt aber auch so machen das wenn ich "programmname.exe 84678" das er direkt die nr anrufen tut
excSchaKaL hat gesagt.:
if (argv[1])
{
isPhoneConnectet ();
return 0;
}

if (argv[2])
{
Dial(pNumber);
printf ("%s", pDaten);
return 0;
}

Du weißt doch hoffentlich schon, wofür argv gut ist, sonst würdest du es nicht benutzen?
argv[0] enthält das erste Element der Kommandozeile, also den Namen des Programms.
argv[1] enthält das nächste Element, also bei einem Programmaufruf von
"programm.exe 43554" wäre das "43554".
usw......

D.h: wenn was mit der Kommandozeile machen willst, benutz doch einfach argv, was du damit bisher machst, weiß ich nich.....


Nachtrag:
Überhaupt: dein Code widerspricht sich in einigen Stellen:
Erst prüfst du, ob argv[1] nicht false ist, falls es nicht false ist, verlässt du das Programm.
D.h, du verbleibst nur im Programm, falls argv[1] false ist, was nur gegeben ist, wenn argc=2 ist.
Danach prüfst du, ob argv[2] nicht false ist. An dieser Stelle könnte das Programm schon theorethisch abstüzen, weil du eigentlich keinen Zugriff auf argv[2] hast, da argc = 2 sein muss.

Danach verwendest du argv[1] für einige Dinge, obwohl es ja in jedem Fall false ist.

Was du mit den Kommandozeilen-Parametern dann immer machst, scheint mir auch ziemlich fragwürdig....

Und nur nebenbei: bei Dateien, die im Standard-Include-Verzeichnis liegen, verwendet man #include<...>, nur bei Dateien im gleichen Verzeichnis #include"..."
Desweiteren sollte man nach dem Standard <iostream> statt <iostream.h> verwenden.

Die Weise in der du die Verwendung von cout mit der von eigenen Ausgabefunktionen, welche printf benutzen abwechselst, erscheint auch nicht gerade sinnvoll und bedacht.




Aber was mich interessieren würde:
Wie funktioniert das mit der Telefonsteuerung genau?
Wie kann man noch andere Dinge machen, als eine Nummer zu wählen?
Weißt du vielleicht sogar eine Möglichkeit, wie man über das Internet auf einen Telefonanschluss anrufen kann oder ähnliches?

Das interessiert sicher auch noch andere, du könntest ja eine kleine Abhandlung dazu schreiben oder dokumentierten Code herausgeben.
 
Zuletzt bearbeitet:
Hi
Also ich selber hab auch noch einige Fehler gefunden die einfach Schusselig waren.
Wegen dem Printf und cout is das so das da 2 Leute dran rumwerkeln.
Das Programm lief halt soweit das ich wenn ich in die Kondole geh und das Programm starte und dort ne NR eingebe das er wählt.
Wie das gehen soll mit Internet hab ich keine Ahnung, da wie ich schon sagte nich so bewandert bin was c++ angeht.
Der Sinn das ich das nun so mache is das es noch in ein anderes Programm eingebunden werden soll.
Wenn du magst kann ich nochmal gern den Quellcode pasten.

mfg schaka
 
Ne, brauchste nicht posten (wegen mir nicht).
Hab eh mein Telefon nicht in den Computer eingesteckt. Oder hast du das etwa nicht? Dann zeig nochmal, aber bitte nicht posten, sondern in den Anhang stecken.

Woher hast du eigentlich das Protokoll für die Kommunikation mit dem Telefon?
Ich hätte eigentlich vermutet, dass das von Gerät zu Gerät anderst aussieht und es daher nicht so einfach ist, mit dem Ding zu reden.

excSchaKaL hat gesagt.:
wie ich schon sagte nich so bewandert bin was c++ angeht
Dafür brauchst du übrigens nicht so viel im speziellen C++, als viel mehr irgendwelche Protokolle + Wissen über Abläufe usw.

excSchaKaL hat gesagt.:
Also ich selber hab auch noch einige Fehler gefunden die einfach Schusselig waren.
War mir schon klar. Immerhin bin ich für meine entdeckten nur flach drüber gegangen, ohne so genau anzuschaun. ;)
 
Zurück