⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fax.cpp

📁 收发传真的C源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	   }
    }
return(Send_Hmsg(NON_FINAL, ctl_byte, 20)); // send the HDLC message
}




/* ******************************************************************** *
 *
 *  Display_ID -- display remote station ID
 *
 * ******************************************************************** */

void Fax::Display_ID(char *pf,BYTE *id,BOOL cr)
{
	if(!cr)return;
	char    cw[21];                             // work area
	short     i, j;                               // work variables

	for (i = 20; i--;)                          // backscan the ID
	    if (id[i] != ' ')                       // q. blank?
			break;                              // a. no .. get out now

	if (i++ == -1)                              // q. ID found?
		return;                                  // a. no .. leave now

	chk_char=0;
	for (j = 0; i--; )
		 {    // copy the ID in reverse
		cw[j++] = id[i];
		if (strchr("0123456789+ ",id[i]) == 0)chk_char=1;
		}
	cw[j] = 0;                                  // .. and end the string

	strcpy(nameBuffer,cw);
	sprintf(fs.f_msg, "%s %s", pf, cw);     // put message in buffer
	(stat)(OUT_MSGREC, &fs);
}





/* ******************************************************************** *
 *
 *  Send_CSI -- Send the called subscriber ID signal to caller
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful; CONNECT response from 调制解调器
 *            1 = NO CARRIER response from 调制解调器
 *
 * ******************************************************************** */

short Fax::Send_CSI(void)

{

return(Send_Our_ID(FAX_FCF_CSI));           // send CSI frame to caller

}



/* ******************************************************************** *
 *
 *  Send_TSI -- Send the transmitting subscriber ID signal
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful
 *            1 = unsuccessful
 *
 * ******************************************************************** */

short Fax::Send_TSI(void)

{

return(Send_Our_ID(FAX_FCF_TSI));           // send TSI frame

}



/* ******************************************************************** *
 *
 *  Send_DIS -- Send the digital ID signal to caller
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful
 *            1 = unsuccesful
 *
 * ******************************************************************** */

short Fax::Send_DIS(void)

{
/*short     i;                                  // work variable
for (i = 6; i>=0;i--)
	 hmsg.data[i] = dis_msg[i];// copy the DIS to hmsg.data
*/
	memcpy(hmsg.data,dis_msg,6);
	return(Send_Hmsg(FINAL, FAX_FCF_DIS, 6));   // send the DIS
}



/* ******************************************************************** *
 *
 *  Send_DCS -- Send the digital control signal to called station
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful
 *            1 = unsuccesful
 *
 * ******************************************************************** */

short Fax::Send_DCS(void)

{
short     i;                                  // work variable

for (i = 6; i--; hmsg.data[i] = dcs_msg[i]);// copy the DCS to hmsg.data
	return(Send_Hmsg(FINAL, FAX_FCF_DCS, 6));   // send the DCS

}



/* ******************************************************************** *
 *
 *  HDLC_Mode -- Enter HDLC mode (transmit or receive)
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful; CONNECT response from 调制解调器
 *            1 = ERROR response from 调制解调器
 *
 * ******************************************************************** */

short Fax::HDLC_Mode(short dir)                 // setup for HDLC tx or rx
                                            // 0 = transmit, 1 = receive
{
short rc;                                     // return code
/*
if (! connected&&dir != TRANSMIT)     // q. we transmitting?
    {                                       // a. yes ..
	cp->Write("AT+FRS=8\r");                  // .. request 80ms silence
    rc = wait_for(cp,FAX_OK,                   // wait for response
			   FAX_ERR, 5) - 1;
    if (rc)                                 // q. any problems?
	   return(rc);                         // a. yes .. return the error
    }
*/

if(connected)
    {                                       // a. yes ..
    connected = FALSE;                      // .. reset connect status
    return(0);                              // .. and return ok
    }
else
	{
	cp->Write(dir ? FAX_RX_HDLC : FAX_TX_HDLC); // start requested HDLC mode
	rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FAX_OK, 10)-1; // see if we connect
	}
return(rc);                                 // return to caller
}



/* ******************************************************************** *
 *
 *  Data_Mode() -- Enter Fax Data mode (transmit or receive)
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful; CONNECT response from 调制解调器
 *            1 = NO CARRIER response from 调制解调器
 *
 * ******************************************************************** */

short Fax::Data_Mode(short dir,                 // 0 = transmit, 1 = receive
			    short speed)               // speed for transfer

{
short rc;                                     // return code
char    msg[25];                            // work area for message

if (/*(dir == TRANSMIT) && */! connected)     // q. we transmitting?
    {                                       // a. yes ..
/*    cp->Write(FAX_SILENT);                  // .. request 80ms silence

    rc = wait_for(cp,FAX_OK,                   // wait for response
                  FAX_ERR, 5) - 1;

    if (rc)                                 // q. any problems?
    return(rc);                         // a. yes .. return the error*/
    }
sprintf(msg,                                // in message area ..
	   dir ? FAX_RX_DATA : FAX_TX_DATA,    // .. select direction of xfer
	   speed);                             // .. and build message

cp->Write(msg);                             // write to 调制解调器
rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FERROR,10)-1; // see if we connect
if(rc!=0)
	{
	cp->Write(msg);                             // write to 调制解调器
	rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FERROR,10)-1; // see if we connect
	}
return(rc);                                 // return to caller

}



/* ******************************************************************** *
 *
 *  Get_Line -- retrieve a CR-terminated line of information
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful
 *            1 = data overrun
 *
 * ******************************************************************** */

short Fax::Get_Line(char *buf,                // buffer to contain info
			   short  secs)                // length of timeout

{
short     loop = TRUE;                        // loop condition
DWORD timer=SECS(secs);                              // timer value


while(loop)                                 // for as long as necessary ..
    {
	if(cp->WaitComm(timer))
    switch(cp->Read(buf))         // attempting to read a byte
        {
        case 0xFFFF:                            // no character available
		     if ((stat)(SCAN_EXIT, &fs))             // q. user press escape?
                return(-2);                 // a. yes.. tell the caller
		      ThreadSwitchWithDelay();
             continue;                       // else .. continue loop

	   case 0:                             // character 已被确认
		  if (*buf == '\r')               // q. character a CR?
			{                            // a. yes ..
			*buf = 0;                    // .. null it out
			loop = FALSE;                // .. and end the loop
			}

		  else                            // else ..
			buf++;                       // .. point to next char position

		  break;                          // end this case

	   default:                            // lost characters
		  return(1);                      // .. show receive unsuccessful
	   }
	else return(-1);
    }

return(0);                                  // show we finished ok
}

/* ******************************************************************** *
 *
 *  Rcv_Hmsg -- receive an HDLC frame
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successfully 已被确认
 *            1 = NO CARRIER or error
 *
 * ******************************************************************** */

short Fax::Rcv_Hmsg(void)

{
short     rc,                                 // return code
	   loop = 1,                           // loop until finished
	   dleflag = FALSE;                    // dle not seen yet

char    *nxtchar;
hmsg.len = 0;                               // initialize length
nxtchar = (char *) cmsg;                    // .. and next receive pointer

if ((rc = HDLC_Mode(RECEIVE)) != 0)         // q. connect ok?
   return(rc);                              // a. no .. leave w/error

DWORD timer = SECS(20);

while(loop)
    {
							 // enter a loop ..
	if(cp->WaitComm(timer))
    switch(cp->Read(nxtchar))     // attempting to read bytes
	   {
	   case 0xFFFF:                            // no character available
		  if ((stat)(SCAN_EXIT, &fs))             // q. user press escape?
			 return(-2);                 // a. yes.. tell the caller
//			 ThreadSwitchWithDelay();
			 continue;                       // else .. continue loop

	   case 0:                             // character 已被确认
		  hmsg.len++;                     // increment 已被确认 count

		  if (dleflag)                    // q. previous char DLE?
			{                            // a. yes ..
			dleflag = FALSE;             // .. reset the flag

			if (*nxtchar == ETX)         // q. DLE ETX sequence?
			    loop = 0;                // a. yes .. exit the loop
			}

		  else if (*nxtchar == DLE)       // q. char a DLE?
			dleflag = TRUE;              // a. yes .. show TRUE

		  nxtchar++;                      // point at next character
		  break;                          // end this case

	   default:                            // lost characters
		  return(1);                      // .. show receive unsuccessful
	   }
	else 
		 return (-1);
   }
rc = wait_for(cp,FAX_OK, FAX_ERR, 10) - 1;      // OK should follow message
Reverse_Bytes(cmsg, hmsg.len - 2);          // reverse the bits
return(rc);                                 // return to caller

}

/* ******************************************************************** *
 *
 *  Send_Hmsg -- send an HDLC frame
 *
 *  returns: -2 = User pressed ESC
 *           -1 - Timeout
 *            0 = successful; CONNECT response from 调制解调器
 *            1 = NO CARRIER response from 调制解调器
 *
 * ******************************************************************** */

short Fax::Send_Hmsg(BYTE finalflg,          // final flag
			    BYTE ctl_byte,          // fax control field
			    short   len)               // length of data bytes

{
short     rc;                                 // return code

hmsg.addr        = FAX_ADDR;                // set the address field
hmsg.ctl_fld     = FAX_CTL | finalflg;      // .. and the control field
hmsg.fax_ctl_fld = ctl_byte;                // .. and fax control field
hmsg.data[len]   = DLE;                     // .. add DLE
hmsg.data[len+1] = ETX;                     // .. and ETX

Reverse_Bytes(cmsg, len+3);                 // reverse the bits

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -