2009-06-09 1 views
0

한 쪽에서는 모뎀 호출을 시도하고 다른 쪽에서는 프로그램이 호출에 응답합니다. 그것은 이동 통신사를 감지하지 않는 것 같습니다. 내가 뭐 잘못하고 있니? 내가 놓친 게 있니?모뎀 호출 (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++ 프로그램이 모뎀 시리얼 포트를 듣고 싶습니다. 내 목적은 발신자 번호가 –

+0

입니다. 죄송합니다. 더 이상 필요하지 않습니다 ... 전 수년 전에 작업 한 프로젝트의 일부였습니다. – deb

답변

0

수신 측에서 ATS0 = 1을 실행하고 모뎀이 자동 응답하도록 할 수 있습니다 (원할 경우 1 대신 원하는 번호로 대체하십시오).

스마트 모뎀이 항상 벨소리 (EV_RING) 신호를 통과하지 않는다는 것을 알 수 있습니다.

편집 : 모뎀이 자동 응답하지 않게하려면 '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