2009-06-09 46 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; 
} 

的INITIALISE部分:

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++程序来监听调制解调器串口,你有吗? 我的目标是得到一个来电显示 – 2017-04-30 12:21:02

+0

对不起,我没有这个了......这是我在很多年前工作的一个项目的一部分。 – deb 2017-05-22 13:12:51

回答

0

您可能想要尝试在接收端发出ATS0 = 1并让调制解调器自动启动(如果您愿意,请用您想要的振铃数代替1)。

您可能会发现智能调制解调器并不总是通过振铃(EV_RING)信号。

编辑:当你不想调制解调器自动应答时,不要忘记'ATS0 = 0'。

3

您可能更容易使用微软的Telephony API(TAPI),而不是直接与调制解调器通信。

+0

谢谢,我会重量该选项。 – deb 2009-06-09 10:33:36