Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的调制解调器呼叫+;_C++_Windows_Events_Modem_Dial Up - Fatal编程技术网

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的人,我已经没有这个了……这是我多年前工作的一部分。