2009-06-09 8 views
0

私は一方の端でモデムの呼び出しをしようとしていますが、もう一方の端でプログラムは呼び出しに応答します。それはキャリアを検出するようではありません。私は間違って何かしていますか?何か不足していますか?modem call in C++

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; 
} 

ポートを開くの一部:

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; 
} 

初期化部分:

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; 
} 

ダイヤル部分:

int Dial(char *telefono) 
{ 

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


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

if (!WriteFile(hSerial, "ATH1\r", strlen("ATH1\r"), (&(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; 
} 

リスニングパート:

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\r", strlen("ATA\r"), (&(n)), 0)) 
      { 
       printf("error"); 
      } 
      FlushFileBuffers(hSerial); 
      break; 
     } 
     else if (dwCommEvent & EV_RLSD) 
     { 
      break; 
     } 
    } 
    printf("fin del bucle"); 
} while(true); 
return 0; 
} 
+0

私は、C++プログラムがモデムのシリアルポートを聞きたいですか? 私の目的は発信者IDを取得しています –

+0

申し訳ありません、もうこれ以上はありません...私は何年も前に仕事をしていたプロジェクトの一部でした。 – deb

答えて

0

受信側でATS0 = 1を発行して、モデムを自動応答させてもかまいません(望むなら、必要な場合は1の代わりに必要な呼び出し回数を代用してください)。

スマートモデムが常にリング(EV_RING)信号を通過するとは限りません。

EDIT:モデムが自動的に応答しないようにする場合は、「ATS0 = 0」を忘れないようにしてください。

3

モデムと直接通信するのではなく、MicrosoftのTelephony API(TAPI)を使用すると、時間がかかることがあります。

+0

ありがとう、私はそのオプションを重み付けます。 – deb

+0

私はこれがあなたを気にしないことを願っていますが、私はTAPIの使用について全く考えていません。 XModemの実装があり、ファイルを送信する前に呼び出しを行うように変更しようとしました... Visual Studio 2008を使用してこれを行いました。これでどのようにTAPIを使用できますか? – deb

+0

TAPIプログラミングを行ってからしばらくしてきましたが、TAPIを使用して接続を確立すると、生データの読み書きに使用できるハンドルが得られます。 TAPIは、デバイスの特定のニーズに対応し、デバイスの競合/共有を処理します。 – Ferruccio

0

おそらくA0 and/or S0=1 Hayesコマンドを回答側に適用する必要があります。

+0

これは完了です:... if(!WriteFile(hSerial、 "ATA \ r"、strlen( "ATA \ r")、(&(n))、0))... しかし、キャリアを検出していない...と私は理由を知らない。ハイパーターミナルを使用して電話を受けると、calleがキャリアを正しく検出します... – deb