windows - modemopkald i c ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at foretage modemopkald i den ene ende, og i anden ende svarer programmet til opkaldet. Det ser ud til at detekterer transportøren. Gør jeg noget galt? Mangler jeg noget?


int main(int argc, char** argv)
{
ParseArgs(argc,argv);

SerialPort* port = SerialPort::New();
if(!port)
    Error(ErrorNoMemory,"Can't create port");

int error = port->Open(PortNum, SendFlag);
if(error)
    Error(error,"Can't open port");

error = port->Initialise(PortBaud);
if(error)
    Error(error,"Can't initialise port");

if(ReceiveFlag)
{
    port->Listen();
    Receive(port); //after the call is stablished I send a file
}
else
{
    port->Dial(PhoneNumber);
     Send(port);
}
port->Close();
delete port;

return 0;
}


Den del af åbningen af ​​havnen:


int Open(unsigned port, bool SendFlag)
{
// make name for port...
char name[] = "\\.\com???.???";
char* nameNumber = name+sizeof(name)-8;
char* nameEnd = nameNumber;
if(port>999){
    return ErrorInvalidPort;
}
if(port>99)
{
    *nameEnd++ = '0'+port/100;
    port \%= 100;
}
if(port>9)
{
    *nameEnd++ = '0'+port/10;
    port \%= 10;
}
*nameEnd++ = '0'+port;
*nameEnd = 0;

// open port...
    hSerial = CreateFile(name, GENERIC\_READ|GENERIC\_WRITE, 0, NULL, OPEN\_EXISTING, 0, NULL);

if(hSerial==INVALID\_HANDLE\_VALUE)
{
    switch(GetLastError())
    {
        case ERROR\_FILE\_NOT\_FOUND:
            return ErrorInvalidPort;
        case ERROR\_ACCESS\_DENIED:
            return ErrorPortInUse;
        default:
            return Error();
    }
}

SetupComm( hSerial, 1024, 1024 );
if (!SendFlag)
{
    if (!SetCommMask(hSerial, EV\_RING |EV\_RLSD))
         // Error setting communications mask
        printf("error mascara");
}
else
{
    if (!SetCommMask(hSerial, EV\_RLSD))
    {
        // Error setting communications mask
        printf("error mascara");
    }
}

return 0;
}


Initialiseringsdelen:


int Initialise(unsigned baud)
{
// flush port...
if(!FlushFileBuffers(hSerial))
    return Error();
if(!PurgeComm(hSerial, PURGE\_TXABORT|PURGE\_RXABORT|PURGE\_TXCLEAR|PURGE\_RXCLEAR))
    return Error();

// configure port...
DCB dcb ;
if(!GetCommState(hSerial, &dcb))
    return Error();
dcb.BaudRate    = CBR\_115200;
dcb.ByteSize    = 8;
dcb.StopBits    = ONESTOPBIT;
dcb.Parity        = NOPARITY;
if(!SetCommState(hSerial, &dcb))
{
    if(GetLastError()==ERROR\_INVALID\_PARAMETER)
        return ErrorInvalidSettings;
    return Error();
}

// set timeouts to zero so read/writes return immediately...
COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout        = MAXDWORD;
timeouts.ReadTotalTimeoutConstant       = 0;
timeouts.ReadTotalTimeoutMultiplier     = 0;
timeouts.WriteTotalTimeoutConstant      = 0;
timeouts.WriteTotalTimeoutMultiplier= 0;
if(!SetCommTimeouts(hSerial, &timeouts))
    return Error();

// flush port again...
if(!PurgeComm(hSerial, PURGE\_TXABORT|PURGE\_RXABORT|PURGE\_TXCLEAR|PURGE\_RXCLEAR))
    return Error();
return 0;
}


Opkaldsdelen:


int Dial(char *telefono)
{

unsigned long int  n = 0;
DWORD dwCommEvent;
DWORD bytes;
DWORD dwRead;
char cadena[15];
char  chRead;


sprintf(cadena, "ATDT\%s
", telefono);

if (!WriteFile( hSerial, "ATH1
", strlen("ATH1
"), (&(n)), 0 ))
{
    printf("error");
}
FlushFileBuffers( hSerial );
Sleep(1000);

if (!WriteFile( hSerial, cadena, strlen(cadena), (&(n)), 0))
{
    printf("error");
}
FlushFileBuffers( hSerial );
Sleep(10000);

printf("Marcamos");

do
{
    printf("Espero eventos");
    if(WaitCommEvent(hSerial, &dwCommEvent, NULL))
    {
        if(dwCommEvent & EV\_RLSD)
        {
            printf("rlsd");
            break;
        }
        else
        {
            printf("otro");
        }
    }
    printf("fin del bucle");
} while(true);



return 0;
}


Den lyttende del:


int Listen()
{
DWORD dwCommEvent;
unsigned long int  n = 0;

do
{
    printf("ESpero eventos");
    if(WaitCommEvent(hSerial, &dwCommEvent, NULL))
    {
        if(dwCommEvent & EV\_RING)
        {
            printf("RING");

            if (!WriteFile( hSerial, "ATA
", strlen("ATA
"), (&(n)), 0 ))
            {
                printf("error");
            }
            FlushFileBuffers( hSerial );
            break;
        }
        else if (dwCommEvent & EV\_RLSD )
        {
            break;
        }
    }
    printf("fin del bucle");
} while(true);
return 0;
}

Bedste reference


Du kan måske prøve at udstede en ATS0=1 på modtagelsessiden og lade modemet automatisk aktivere (erstat det antal ringe, du vil have i stedet for 1, hvis du ønsker det).


Du kan opdage, at smarte modemmer ikke altid går gennem ringet (EV\_RING) signalet.


EDIT: Glem ikke at 'ATS0=0', når du ikke vil have modemet til automatisk at svare igen.

Andre referencer 1


Du har muligvis en nemmere tid ved at bruge Microsofts telefoni API (TAPI) i stedet for at forsøge at tale direkte til modemmet. [6]

Andre referencer 2


Måske skal du anvende A0 og/eller S0=1 Hayes kommandoen på telefonsvareren. [7]