Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Com-port/usb-port mit At Commandos ansprechen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.06.2003, 17:14 Uhr
~Andrea Boeswett
Gast


Hallo,

möchte gern über den Com-Port und USB ein Modem mit AT Commandos ansprechen.
Habe leider aber keine genauen Kenntnisse ob C++ dies direkt unterstützt.
Bei VB habe ich was von MsComm gelesen, gibt es da ähnliches für C++?

Kennt jemand einen einfachen Weg, ein "AT" Commando in Richtung Com-Port oder USB abzusetzen?

Es reicht aus, wenn "ATD", "ATH" und "ATA" als Kommandos übertragen werden.

Gruß Andrea
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.06.2003, 18:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi,

serielle Schnittstelle kannst du so ansprechen.

Wie das genau mit diesem Modemstandard geht weiss ich auch nicht, aber ich vermute mal das du ihm einfach direkt die befehle in ascii schicken kannst

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 16.06.2003 um 18:48 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.06.2003, 09:16 Uhr
ao

(Operator)


Genau. Etwa so:


C++:
char szATCommand [1024]; /* einfach nur genug Platz */
DWORD nNumberOfBytesWritten;
strcpy (szATCommand, "AT");
WriteFile (hComPort, szATCommand, strlen (szATCommand), &nNumberOfBytesWritten, NULL);

/* Modem sollte mit "OK" antworten, wir lassen aber vorsichtshalber mal genug Platz für "ERROR" */
char szModemAnswer [32]; /* hoffentlich genug Platz */
DWORD nNumberOfBytesRead;
ReadFile (hComPort, szModemAnswer, sizeof szModemAnswer, &nNumberOfBytesRead, NULL);
/* danach sollte in szModemAnswer die Antwort drinstehen. */


Da du in Wahrheit weniger als 32 Zeichen abholen willst ("OK\n"), mußt du noch ein Timeout für die COM-Schnittstelle setzen: SetCommTimeout() ist dein Freund. Die COMMTIMEOUTS-Struktur hierfür würde ich im ersten Anlauf so vorbelegen:

C++:
COMMTIMEOUTS sctTimeouts = { 100, 0, 0, 0, 0 };


Das bedeutet 100 ms zwischen zwei aufeinanderfolgenden Zeichen und sonst keine Timeout-Bedingung.

In der MSDN-Hilfe gibts noch viel mehr Info hierzu. Stichwörter: ReadFile, WriteFile, SetCommTimeouts, COMMTIMEOUTS. Die Funktionen sind ziemlich tricky, richtig konfiguriert können sie dir die ganze Wartesteuerung beim Empfang abnehmen. Tipp: unbedingt nachlesen. Für die ersten Versuche sollte es aber so oder ähnlich gehen.

Viel Erfolg

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.06.2003, 12:13 Uhr
~Andrea Boeswett
Gast


Hi,

leider tut bei mir das Modem nichts, es meldet am Anfang immer einen Fehler, dannach aber OK.
Aber bei ATD <Nummer> wählt es nichts, bringt nur die Meldung das alles OK ist.

Der Code:

#include <windows.h>
#include <iostream.h>
#include <stdio.h>

#define COMPORT "COM3"
#define TEST "AT;"
#define ANRUFEN "ATD <Nummer>;" //anzurufende Nummer
#define AUFLEGEN "ATH;"
#define ANNEHMEN "ATA;"

void main()
{
//Initialisieren der Schnittstelle
HANDLE h_ComPort = CreateFile(COMPORT, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);

cout << "\nHandle auf Com-Port: " << PORT << " - " << h_ComPort << endl;

DCB dcb;
COMMTIMEOUTS cto;

// Übertragungsparameter abrufen
cout << "GetCommState: " << GetCommState(h_ComPort, &dcb) << endl;

//hier kannst du die Übertragunsparameter definieren diese 4 sollten die wichtigsten sein, an sonsten einfach mal die members von DCB anschauen
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity =NOPARITY;
dcb.StopBits = ONE5STOPBITS; //ONESTOPBIT;

// Übertragungsparameter übernehmen
cout << "SetCommState: " << SetCommState(h_ComPort, &dcb) << endl;

//TimeOut-Werte abrufen
cout << "GetCommTimeouts: " << GetCommTimeouts(h_ComPort,&cto) << endl;

//TimeOut für die COM-Schnittstelle definieren
cto.ReadIntervalTimeout = 100;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 0;

//TimeOut-Werte setzen
cout << "SetCommTimeouts: " << SetCommTimeouts(h_ComPort,&cto) << endl;

//lesen ist mit Readfile, schreiben analog mit Writefile
int ErrorCode;

char szATCommand[1024];//[100];
DWORD nNumberOfBytesWritten;

char szModemAnswer[32];
DWORD nNumberOfBytesRead;

// Wiederholungsschleife
char d;
bool repeat = true;
while ( repeat )
{
// zurücksetzen
for(int j=0, i=0; j<=sizeof(szModemAnswer), i<=sizeof(szATCommand); j++, i++)
{
szATCommand[i]=NULL;
szModemAnswer[j]=NULL;
}


printf("\n(T)est, (A)nrufen, A(u)flegen, A(n)nehmen, (c)hecken, (Q)uit ?");
cin >> d;
switch(d){
case 't':
strcpy(szATCommand, TEST);
break;
case 'a':
strcpy(szATCommand, ANRUFEN);
break;
case 'u':
strcpy(szATCommand, AUFLEGEN);
break;
case 'n':
strcpy(szATCommand, ANNEHMEN);
break;
case 'c':
while ( repeat )
{
// zurücksetzen
szATCommand[1024]=NULL;
szModemAnswer[32]=NULL;

if(szModemAnswer!= "RING")
{
//Lesen
ErrorCode = ReadFile(h_ComPort, szModemAnswer, sizeof(szModemAnswer), &nNumberOfBytesRead, NULL);

if(ErrorCode == 0)
{
cout << "Fehler bei ReadFile: " << ErrorCode << endl;
}
else
{
cout << "\nReadFile OK!\n" << "Rueckgabe vom Modem: " << szModemAnswer << endl;
}
}
else
{
strcpy(szATCommand, ANNEHMEN);
repeat = false;
}
}
break;
case 'q':
strcpy(szATCommand, TEST);
repeat = false;
break;
default:
printf( "\nDiese Taste ist nicht belegt: %c", d);
}

//Schreiben
ErrorCode = WriteFile(h_ComPort, szATCommand, strlen(szATCommand), &nNumberOfBytesWritten, NULL);

if(ErrorCode == 0)
{
cout << "Fehler bei WriteFile: " << ErrorCode << endl;
}
else
{
cout << "\nWriteFile OK!\n" << "Geschrieben wurden: " << szATCommand << endl;
}


//Lesen
ErrorCode = ReadFile(h_ComPort, szModemAnswer, sizeof(szModemAnswer), &nNumberOfBytesRead, NULL);

if(ErrorCode == 0)
{
cout << "Fehler bei ReadFile: " << ErrorCode << endl;
}
else
{
cout << "\nReadFile OK!\n" << "Rueckgabe vom Modem: " << szModemAnswer << endl;
}

}//while

//am ende schliessen nicht vergessen
cout << "\nClose Handle: " << CloseHandle(h_ComPort) << endl;
}

Weiß jemand was ich falsch mache?
Ich verstehe das nicht, fehlen irgendwelche wichtigen Parameter.
Unter HyperTerminal bekomme ich ein Verbindung, daher die Modems sind in Ordnung.

Gruß Andrea
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.06.2003, 12:53 Uhr
ao

(Operator)


Das Semikolon hinter den AT-Kommandos ist falsch, also nicht
#define TEST "AT;"
sondern
#define TEST "AT"
oder besser
#define TEST "AT\n"
oder
#define TEST "AT\r"
, damit erschlägst du gleich die Return-Taste mit.

Übrigens läuft die for-Schleife, mit der du szATCommand und szModemAnswer auf 0 setzt, 1024-mal, wenn ich das richtig überblicke. Das ModemAnswer-Feld ist aber nur 32 Zeichen lang -> Access Violation droht! Wenn das bisher nicht passiert ist, war's nur Zufall.

Das Null-Setzen von szATCommand ist auch gar nicht nötig; durch strcpy wird am Ende automatisch ein Nul-Zeichen eingefügt.

Ist es denn ein serielles oder ein USB-Modem? Der Unterschied ist deswegen wichtig, weil beim seriellen Modem die Handshake-Leitungen passend konfiguriert sein müssen (das geht in der DCB-Struktur).

ao

Dieser Post wurde am 17.06.2003 um 12:53 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.06.2003, 13:44 Uhr
~Andrea Boeswett
Gast


Hi,

danke für den Tipp mit:

Das Semikolon hinter den AT-Kommandos ist falsch, also nicht
#define TEST "AT;"
sondern
#define TEST "AT"
oder besser
#define TEST "AT\n"
oder
#define TEST "AT\r"
, damit erschlägst du gleich die Return-Taste mit.

danach hat es super funktioniert!

Es sind 2 Handys, eines per Serial und eines per USB.
Bei beiden funktioniert es jetzt.

Die for-Schleife nehme ich wieder raus, er hatte mir vorher nie den Inhalt ganz geleert und ich dachte der Rest der da drin steht, führt zu dem Fehler!

Gruß Andrea
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: