# Befehle senden über die serielle Schnittstelle



## Myslee (1. Februar 2008)

Hallo Leute,

zur Zeit sitze ich an einem kleinen Projekt, bei dem ich über sogenannte AT-Befehle mein Handy über die serielle Schnittstelle steuern kann.
Allerdings läuft das im Moment nur über Hyperterminal und manuelle Eingabe der Befehle.

Ich würde das Ganze aber gerne in C++ automatisieren.

Nun zu meinem Problem:

Wie steuer ich die serielle Schnittstelle in C++ richtig an und wie kann ich einen Befehl ("z.B.: atdHandynummer) abschicken.

Ich hab schon den ganzen Nachmittag danach gesucht, nur finde ich nichts. Bis jetzt bin ich soweit gekommen:

meine cpp-Datei:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (){


DCB          sDcb;
HANDLE       hFile;
COMMTIMEOUTS sTo;


   hFile=CreateFile("\\\\.\\COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hFile==INVALID_HANDLE_VALUE)return 0;
memset(&sDcb,0,sizeof(sDcb));
sDcb.DCBlength       = sizeof(sDcb);
sDcb.BaudRate        = 9600;    // Baudrate
sDcb.fParity         = FALSE;
sDcb.fBinary         = TRUE;
sDcb.Parity          = NOPARITY;// Kein Paritybit
sDcb.StopBits        = ONESTOPBIT;
sDcb.fOutxCtsFlow    = FALSE;
sDcb.fOutxDsrFlow    = FALSE;
sDcb.fDtrControl     = DTR_CONTROL_ENABLE;
sDcb.fRtsControl     = RTS_CONTROL_ENABLE;
sDcb.fDsrSensitivity = FALSE;
sDcb.fAbortOnError   = FALSE;
sDcb.ByteSize        = 8;       // 8 Datenbits

if(!SetCommState(hFile,&sDcb))
     {
     CloseHandle(hFile);
     return 0;
     }

sTo.ReadIntervalTimeout = MAXDWORD; // 0 ms Read-Tomeout
sTo.ReadTotalTimeoutMultiplier = 0;
sTo.ReadTotalTimeoutConstant   = 0;
sTo.WriteTotalTimeoutMultiplier= 1; // 1*2 ms Write Timeout
sTo.WriteTotalTimeoutConstant  = 2;

if(!SetCommTimeouts((HANDLE)hFile,&sTo))
     {
     CloseHandle(hFile);
     return 0;
     }




DWORD dwCount;
char  cData[16]="atdHandynummer";             //für Handynummer müsste da jetzt ne Nummer hin.

ReadFile (hFile,cData,16,&dwCount,0);
WriteFile(hFile,cData,16,&dwCount,0);
system("pause");

}




Der obere Kram ist zum Öffnen der Schnittstelle (ich hoffe, dass das alles so richtig ist).

Nur bei den letzten beiden Absätzen tut sich nichts (normalerweise müsste das Handy daraufhin die Nummer wählen).


Ich hoffe hier kann mir jemand weiterhelfen .....


----------



## Endurion (2. Februar 2008)

Sieht so weit eigentlich ok aus.

Was soll das ReadFile denn da vorne? Schickt das Handy dauernd etwas? Sonst bleibt das Programm nämlich bei ReadFile stehen und wartet, bis 16 Bytes angekommen sind.


----------



## Myslee (2. Februar 2008)

Das weiß ich eben nicht so genau ...
Ich hab den Code zum Senden im Internet gefunden, mit dem Kommentar, dass man so etwas senden kann ...

Das Programm bleibt dort aber auch nicht stehen .... das "rauscht" so durch und landet beim "Pause"-Befehl.

In Hyperterminal ist es ja so, dass jede Eingabe erst zu sehen ist, wenn das Handy das Echo dazu gesendet hat (die Verbindung also ok ist).
Kann es also sein, dass ich immer erst ein Zeichen senden muss und dann auf die Antwort des Handys warte bis ich das nächste Zeichen senden kann


----------



## Chriss612 (19. April 2010)

schon uralt ich weiß aber falls jmd auch sowas sucht und nich weiß wieso die nummer nicht gewählt wird:

DWORD dwCount;
char cData[16]="atdHandynummer\r";    //für Handynummer müsste da jetzt ne Nummer hin.


WriteFile(hFile,cData,16,&dwCount,0);
system("pause");

dann gehts =)


----------

