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

📄 serial.c

📁 Gcomm is a serial communications program similar to seyon, but more modern, and easier to use. Works
💻 C
📖 第 1 页 / 共 2 页
字号:
	dState = state ;	DialogStart(ModemPats, NModemPats, time, SerialDialog) ;}voidSerialConnect(){	char	*phone = getPhoneNo() ;	hangingUp = 0 ;	if( SerialOpen(serialPort()) < 0 )	  return ;	connectionActive = True ;	connectTime0 = time(NULL) ;	WindowModem() ;	if( phone[0] != '\0' )	{	  /* begin modem dialog */	  WindowStatus("Connecting to Modem...") ;	  bufWrite(ofd, "AT\r", 3) ;	  dialogInit(dSModemConnect, MODEM_TIMEOUT) ;	}	else	  WindowStatus("Serial port opened") ;}voidSerialDisConnect(){	char	*phone = getPhoneNo() ;	if( ifd == -1 )	  return ;	if( phone[0] != '\0' )	{	  /* begin modem dialog */	  WindowStatus("Connecting to Modem...") ;	  bufWrite(ofd, "AT\r", 3) ;	  dialogInit(dSModemDisConnect, MODEM_TIMEOUT) ;	}	else {	  SerialClose() ;	  ConnectionDone() ;	}}static	voidunexpected(int which){	if( which == -1 )	  WindowStatus("Modem does not respond") ;	else	  WindowStatus("Unexpected modem response %d", which) ;	sleep(1) ;}static	voiddialNext(){	if( modemDialNext() ) {	  WindowStatus("Dialing next number...") ;	  dialogInit(dSModemDialing, DIAL_TIMEOUT) ;	}}	/* handle input during serial connect/disconnect dialog. */static	voidSerialDialog(int which){	char	buf[32] ;	if( connectAbort ) {		/* cancel dialog, connection remains */	  bufWrite(ofd, "AT\r", 3) ;	  WindowStatus("Cancelled") ;	  return ;	}	switch( dState ) {	  case dSModemConnect:	    switch( which ) {	      case -1:		/* timeout */	      default:		unexpected(which) ;		break ;	      case 0:		/* OK */		WindowStatus("Resetting Modem...") ;		if( modemInit[0] != '\0' ) {		  bufWrite(ofd, modemInit, strlen(modemInit)) ;		  bufWrite(ofd, "\r", 1) ;		}		else {		  /* reset it ourselves.  TODO: support other than hayes */		  bufWrite(ofd, "ATZ\r", 4) ;		}		dialogInit(dSModemInit, MODEM_TIMEOUT) ;	    }	    break ;	  case dSModemInit:	    switch( which ) {	      case -1:		/* timeout */	      default:		unexpected(which) ;		break ;	      case 0:		/* OK */		WindowStatus("Setting Modem...") ;		/* init it ourselves.  TODO: support other than hayes */		/* set: verbose result codes */		bufWrite(ofd, stdResetStr, sizeof(stdResetStr)-1) ;		switch( modemAttn ) {		  case ModemAttnEsc:		    sprintf(buf, "\\K5&D0S2=%d", modemEsc[0]) ;		    bufWrite(ofd, buf, strlen(buf)) ;		    break ;		  case ModemAttnBrk:		    bufWrite(ofd, "\\K4&D0S2=128", 12) ;		    break ;		  case ModemAttnDtr:		    bufWrite(ofd, "\\K5&D1S2=128", 12) ;		    break ;		}		bufWrite(ofd, "\r", 1) ;		dialogInit(dSModemSetup, MODEM_TIMEOUT) ;	    }	    break ;	  case dSModemSetup:	    switch( which ) {	      case -1:		/* timeout */	      default:		unexpected(which) ;		break ;	      case 0:		/* OK */		if( modemDialFirst() ) {		  WindowStatus("Dialing...") ;		  dialogInit(dSModemDialing, DIAL_TIMEOUT) ;		}		else		  WindowStatus("Phone number not found") ;		break ;	    }	    break ;	  case dSModemDialing:	    switch( which ) {	      case -1:		/* timeout */		bufWrite(ofd, "AT\r", 3) ;	      case 2:		/* NO CARRIER */		WindowStatus("No answer") ;		dialNext() ;		break ;	      case 1:		/* CONNECT */		WindowStatus("Connected") ;		modemDialDone() ;		break ;	      case 3:		/* BUSY */		WindowStatus("Busy") ;		dialNext() ;		break ;	      case 5:		/* NO DIAL TONE */		WindowStatus("No dial tone") ;		modemDialDone() ;		break ;	      default:		unexpected(which) ;		dialNext() ;		break ;	    }	    break ;	  case dSModemDisConnect:	    switch( which ) {	      case -1:		/* timeout */	      case 1:		/* CONNECT */		/* modem still connected, seize control */		WindowStatus("Grabbing modem...") ;		modemBreak() ;		dialogInit(dSModemBreak, MODEM_TIMEOUT) ;		break ;	      default:		/* anything else is good enough */		WindowStatus("Hanging up...") ;		hangingUp = 1 ;		SetHardwareFlow() ;		bufWrite(ofd, "ATH0\r", 5) ;		dialogInit(dSModemHangup, MODEM_TIMEOUT) ;		break ;	    }	    break ;	  case dSModemBreak:	    switch( which ) {	      default:		unexpected(which) ;	      case 0:		/* OK */	      case 2:		/* NO CARRIER */		WindowStatus("Hanging up...") ;		hangingUp = 1 ;		SetHardwareFlow() ;		bufWrite(ofd, "ATH0\r", 5) ;		dialogInit(dSModemHangup, MODEM_TIMEOUT) ;		break ;	    }	    break ;	  case dSModemHangup:	    switch( which ) {	      default:		unexpected(which) ;	      case 0:		/* OK */	      case 2:		/* NO CARRIER */		hangingUp = 0 ;		SetHardwareFlow() ;		WindowStatus("Resetting modem...") ;		if( modemReset[0] != '\0' ) {		  bufWrite(ofd, modemReset, strlen(modemReset)) ;		  bufWrite(ofd, "\r", 1) ;		}		else {		  bufWrite(ofd, "ATZ\r", 4) ;		}		dialogInit(dSModemReset, MODEM_TIMEOUT) ;		break ;	    }	    break ;	  case dSModemReset:	    switch( which ) {	      default:		unexpected(which) ;	      case 0:		/* OK */	      case 2:		/* NO CARRIER */		SerialClose() ;		ConnectionDone() ;		break ;	    }	    break ;	}}	/* dial a number */static	voidcall(char *string){	bufWrite(ofd, "ATD", 3) ;	bufWrite(ofd, string, strlen(string)) ;	bufWrite(ofd, "\r", 1) ;}	/* get first phone number, dial it and return true.  Return 	 * false if no more phone number(s)	 */static	int	modemFileCount ;	/* # files tried */static	FILE	*modemFile ;static	intmodemDialFirst(){	char	*phone = getPhoneNo() ;	if( phone[0] != '@' ) {	  call(phone) ;	  return 1 ;	}	modemFileCount = 0 ;	modemFile = NULL ;	return modemDialNext() ;}	/* Get next phone number, dial it and return true.  Return	 * false if no more phone numbers */static	intmodemDialNext(){	char	line[128] ;	int	len ;	char	*ptr ;	char	*env ;	char	*phone = getPhoneNo() ;	if( phone[0] != '@' )	  return 0 ;	/* phone numbers come from $PHONES or /etc/phones */	if( modemFile == NULL )	  switch( modemFileCount ) {	    case 0:	      if( (env = getenv("PHONES")) != NULL  &&		  (modemFile = fopen(env, "r")) != NULL )		break ;	      else		++modemFileCount ;	    case 1:	      if( (modemFile = fopenU(EtcPhones, "r")) != NULL )		break ;	    case 2:	    default:	      return 0 ;	  }	/* search phone numbers file for a match.  Format is:	 *	#comment	 *	<name><blanks><number>	 * see phones(5)	 */	len = strlen(phone+1) ;	while( fgets(line, sizeof(line), modemFile) != NULL )	{	  if( line[0] != '#' )	  {	    if( strncmp(line, phone+1, len) == 0  &&		isspace(line[len]) )	    {	      if( (ptr = strchr(line+len, '\n')) != NULL )		*ptr = '\0' ;	      for( ptr = line+len; isspace(*ptr); ++ptr) ;	      if( *ptr != '\0' ) {		call(ptr) ;		return 1 ;	      }	    }	  }	}	fclose(modemFile) ;	modemFile = NULL ;	++modemFileCount ;	return modemDialNext() ;}static	voidmodemDialDone(){	if( modemFile != NULL ) {	  fclose(modemFile) ;	  modemFile = NULL ;	}}	/* execute modem reset sequence as defined by modemAttn and	 * modemEsc	 */static	voidmodemBreak(){	char	attn[3] ;static	int	dtr = TIOCM_DTR ;	switch( modemAttn ) {	  case ModemAttnEsc:	    sleep(2) ;	    attn[0] = modemEsc[0] ; attn[1] = modemEsc[0] ;	    attn[2] = modemEsc[0] ;	    bufWrite(ofd, attn, 3) ;	    sleep(2) ;	    break ;	  case ModemAttnBrk:	    tcsendbreak(ofd, 0) ;	    break ;	  case ModemAttnDtr:	    /* TODO: is there a posix-compatible way to do this? */	    (void) ioctl(ofd, TIOCMBIC, &dtr) ;	    sleep(1) ;	    (void) ioctl(ofd, TIOCMBIS, &dtr) ;	    break ;	}}#ifdef	COMMENTvoiddump_buffer(char *data, int len, Buffer *buf){	int	i,j ;	struct timezone z ;	if( len <= 0 )	  return ;	if( !ascout ) {	  if( lastread != buf ) {	    gettimeofday(&timestamp, &z) ;	    lastread = buf ;	  }	  i = fwrite((char *)&buf->which, sizeof(buf->which), 1, stdout) ;	  i = fwrite((char *)&timestamp, sizeof(timestamp), 1, stdout) ;	  i = fwrite((char *)&len, sizeof(len), 1, stdout) ;	  i = fwrite(data, 1, len, stdout) ;	}	else	{	  for(j = len; j > 0; ) {	    i = j > 32 ? 32 : j ;	    if( buf->which == 1 )	      printf("\t\t\t\t\t") ;	    while( --i >= 0 ) {	      putchar( *data >= ' ' && *data <= 0176 ? *data : '.') ;	      ++data ;	      --j ;	    }	    putchar('\n') ;	  }	}}#endif	/* COMMENT */

⌨️ 快捷键说明

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