C++ c+中的调制解调器呼叫+;
我试图在一端拨打调制解调器电话,而在另一端,程序会接听电话。它似乎没有检测到载体。我做错什么了吗?我错过什么了吗C++ c+中的调制解调器呼叫+;,c++,windows,events,modem,dial-up,C++,Windows,Events,Modem,Dial Up,我试图在一端拨打调制解调器电话,而在另一端,程序会接听电话。它似乎没有检测到载体。我做错什么了吗?我错过什么了吗 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, SendFl
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;
}
使用Microsoft(TAPI)可能比直接与调制解调器通话更轻松。使用Microsoft(TAPI)可能更轻松而不是试图直接与调制解调器通话。可能需要在应答端应用Hayes命令。可能需要在应答端应用Hayes命令。您可能需要尝试在接收端发出ATS0=1,让调制解调器自动应答(如果愿意,请用您想要的戒指数代替1) 您可能会发现,智能调制解调器并不总是通过环(EV_环)信号
编辑:当您不想让调制解调器再自动应答时,请不要忘记使用“ATS0=0”。您可以尝试在接收端发出ATS0=1,并让调制解调器自动应答(如果愿意,用您想要的响铃数代替1) 您可能会发现,智能调制解调器并不总是通过环(EV_环)信号
编辑:当你不想让调制解调器自动应答时,别忘了“ATS0=0”。谢谢,我会权衡这个选项。我希望这不会打扰你,但我不知道如何使用TAPI。我有一个XModem的实现,我试图在发送文件之前修改它以打电话……我是用Visual Studio 2008实现的。如何我可以使用TAPI吗?我已经有一段时间没有做过TAPI编程了,但我记得你会使用TAPI建立连接,它会给你一个句柄,你可以用它来读/写原始数据。TAPI可以处理任何设备特定的需要,以及处理设备争用/共享。谢谢,我会权衡这个选项。我希望这样做我不想打扰你,但我不知道如何使用TAPI。我有一个XModem的实现,我试图修改它以在发送文件之前打电话……我是使用Visual Studio 2008完成的。我如何使用TAPI来处理这个问题呢?我已经有一段时间没有做TAPI编程了,但我记得你会使用TAPI来建立连接,它会给你带来好处ou是一个可用于读取/写入原始数据的句柄。TAPI负责处理任何特定于设备的需求以及设备争用/共享。完成后:…如果(!WriteFile(hSerial,“ATA\r”,strlen(“ATA\r”),(&(n)),0))…但是主叫方没有检测到载波…我也不知道为什么。当我使用超级终端接收呼叫时,被叫方正确地检测到载波…完成:…如果(!WriteFile(hSerial,“ATA\r”,strlen(“ATA\r”),(&(n)),0))……但电话侧没有检测到载波……我不知道为什么。当我用超终端接收呼叫时,卡利正确地检测到载波……我想要一个C++程序来听调制解调器串口,你有吗?我的目标是找个叫IDSorry的人,我已经没有这个了……这是我正在做的一个项目的一部分。几年前,我想用一个C++程序来听一个调制解调器串口,你有吗?我的目标是找个叫IDSorry的人,我已经没有这个了……这是我多年前工作的一部分。