Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » wiedermal die serielle Schnittstelle

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
28.03.2006, 12:15 Uhr
Roland



Hab ein Problem, möchte auf mein Handy mittels AT Commands zugreifen, mit dem Hyperterminal funkt das einwandfrei.

Will Daten die ich vom einem anderen Handy geschickt bekomme in ein .txt schreiben, aber ich scheiter schon mal an einfachen Dingen:
Hier mal der Quellcode, vielleicht fällt ja gleich jemanden auf was falsch ist:

C++:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>

#define COMPORT "COM1"
#define TEST "AT\r"
#define ANRUFEN "ATDT0664\r;" //anzurufende Nummer
#define AUFLEGEN "ATH\r"
#define ANNEHMEN "ATA\r"
#define ECHOOFF "AHE0\r"
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: " << COMPORT << " - " << h_ComPort << endl;

DCB dcb;
COMMTIMEOUTS cto;

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

//Uebertragungsparameter definieren
dcb.BaudRate = CBR_19200;
dcb.ByteSize = 8;
dcb.Parity =NOPARITY;
dcb.StopBits = 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;

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

char szModemAnswer[80];
DWORD nNumberOfBytesRead;

    do
    {
        strcpy(szATCommand, TEST);
        WriteFile(h_ComPort, szATCommand, strlen(szATCommand), &nNumberOfBytesWritten, NULL);
        
        ReadFile(h_ComPort, szModemAnswer, strlen(szModemAnswer), &nNumberOfBytesRead, NULL);
        
    
    }
    while(szModemAnswer!="OK");

    cout << "Verbindung erfolgreich\n";
}



im Hyperterminal muss ich die Flusskontrolle auf Xon/Xoff stellen. wie mach ich das hier, vielleicht liegt es ja daran. wenn ich das kompiliere und ausführe, kommt auf jeden Fall nur Mist retour.
Entweder das Programm bleibt in der do while Schleife weil eben kein OK retour kommt, oder es steht Datenmüll im szModemAnswer.

Bitte um Hilfe, weiß echt nicht mehr weiter.

lg Roland
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.03.2006, 13:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, schau dir mal meine Posts in folgendem Thread an, da siehste auch wie du "nichtblockierend" lesen kannst.

www.fun-soft.de/showtopic.php?threadid=14673
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.03.2006, 13:44 Uhr
Roland



danke für die Antwort, aber kann damit eigentlich nicht viel anfangen, da ich noch nie was mit der seriellen zu tun hatte und den Code von oben hab ich auch aus diveresen Foreneinträgen zusammengefügt.

Wie meinst du "nichtblockierend"?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.04.2006, 13:25 Uhr
Roland



sodala, bin einen kleinen Schritt weiter gekommen. Bekomm jetzt das ok zurück, kann es mit strcmp auch vergleichen, aber wenn ich dann auf den Ring warte hupft er aus der Schleife nicht mehr raus, vielleicht wer eine Ahnung warum?

Hier mal der neue Code:


C++:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>


#define COMPORT "COM1"
#define TEST "AT\r"
#define ANRUFEN "ATDT06641129151\r;" //anzurufende Nummer
#define AUFLEGEN "ATH\r"
#define ANNEHMEN "ATA\r"
#define ECHOOFF "AHE0\r"
#define TXT "D:\\cpp\\defues.txt"

BOOL WriteABuffer(char * lpBuf, DWORD dwToWrite);

int main()
{
    
    /*------------------------COMPORT OEFFNEN UND SCHNITTSTELLENEIGENSCHAFTEN SETZEN---------------*/
    
    cout << "Comport offnen\n";
    //COMPORT OEFFNEN
    HANDLE h_ComPort = CreateFile(COMPORT, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);
    
    if(h_ComPort == INVALID_HANDLE_VALUE)
    {
        cout << "Port konnte nicht geöffnet werden!\n";
    }


    //SCHNITTSTELLEN EIGENSCHAFTEN
    cout << "Schnittstelleneigenschaften setzen\n";
    DCB dcb;

    dcb.BaudRate = CBR_19200;
    dcb.ByteSize = 8;
    dcb.Parity =NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.fOutxCtsFlow = false;    // Disable CTS monitoring
    dcb.fOutxDsrFlow = false;    // Disable DSR monitoring
    dcb.fDtrControl = DTR_CONTROL_ENABLE;    // Disable DTR monitoring
    dcb.fOutX = true;        // Disable XON/XOFF for transmission
    dcb.fInX = true;        // Disable XON/XOFF for receiving
    dcb.fRtsControl = RTS_CONTROL_ENABLE;    // Disable RTS (Ready To Send)
    dcb.fTXContinueOnXoff=true;
    dcb.XoffLim=10;
    dcb.XonLim=10;

    SetCommState(h_ComPort, &dcb);


    //TIMEOUTS

    cout << "Timeouts setzen\n";

    COMMTIMEOUTS cto;

    cto.ReadIntervalTimeout = 20;
    cto.ReadTotalTimeoutMultiplier = 10;
    cto.ReadTotalTimeoutConstant = 100;
    cto.WriteTotalTimeoutMultiplier =10;
    cto.WriteTotalTimeoutConstant = 100;

    SetCommTimeouts(h_ComPort,&cto);

    /*------------------------TEXT DATEI OEFFNEN ---------------*/

    cout << "txt oeffnen\n";
    FILE *datei;

    datei = fopen(TXT,"a+t");
    fseek(datei, 0,SEEK_END);
    char tabulator[3];
    strcpy(tabulator, "\ta\n");
    fwrite(tabulator,sizeof(tabulator),1,datei);
    fclose(datei);

    
    /*------------------------ECHO ABSCHALTEN (ATE0) ---------------*/

    cout << "Senden Teststring\n";
    char ATCommand[6];//[100];
    strcpy(ATCommand, "ATE0\r");
    DWORD nNumberOfBytesWritten;

    char ModemAcn[2];
    ModemAcn[2]=NULL;
    int ret;
    DWORD nNumberOfBytesRead;
    do
    {
        WriteFile(h_ComPort, ATCommand, sizeof(ATCommand), &nNumberOfBytesWritten, NULL);
        cout << " AT geschrieben\n";
        ReadFile(h_ComPort, ModemAcn, sizeof(ModemAcn), &nNumberOfBytesRead, NULL);
        cout << ModemAcn <<"\n";
        ret = strcmp(ModemAcn, "OK");
    }
    while(ret!=0);


    cout << ModemAcn <<"OK wurde empfangen\n";

    /*------------------------AUF RING WARTEN ---------------*/

    char ModemRing[6];
    ModemRing[6]=NULL;
    int retour;
        
    do
    {
        //ModemRing[6]=NULL;
        ReadFile(h_ComPort, ModemRing, sizeof(ModemRing), &nNumberOfBytesWritten, NULL);
        cout << ModemRing << "\n";
        retour= strcmp(ModemRing, "RING");
        cout << retour;
    }
    while(retour!=0);

    cout << "geschafft\n";

        CloseHandle(h_ComPort);

return 0;
}




lg Roland

Dieser Post wurde am 13.04.2006 um 13:27 Uhr von Roland editiert.
 
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: