首先要打开串口,然后通过串口来向modem发at指令来进行通讯,编程的时候要特别注意要用适当的方式打开串口,其实对TTY的操作跟一般的文件操作没有特别的区别,区别就是在于串口通讯需要设置串口属性.
                /************************************************************** 
Function : open serial comport 
Param In : 
pszDevName : comport device name, eg."/dev/tty1a" 
uiBaud : baudrate. 50 -- 9600 
bParity : parity. NOPRAITY, ODDPARITY, EVENPARITY 
bByteSize : size of a byte. 5 - 8 
bStopBits : stop bits. 1 - 2 
bFlowControl : flow control. NOFLOW, CTSRTS, XONXOFF 
uiOutQueueLen : length of output buffer queue 
uiInQueueLen : length of input buffer queue 
iDefTimeOut : default timeout 
bOperFlag : OP_READ , OP_WRITE 
Param Out : none 
Return Code 
>=0 : success, handle of this comport 
<0 : serOpenMany 
serAllocMem 
serOpenInFp 
serOpenOutFp 
serFlowCtrlBad 
serBaudBad 
serByteSizeBad 
serStopBitsBad 
serParityBad 
serSetInBuffer 
serSetOutBuffer 
***************************************************************/ 
int serOpen(char *pszDevName, uint uiBaud, uchar bParity, uchar bByteSize, 
uchar bStopBits, uchar bFlowControl, uint uiOutQueueLen, 
uint uiInQueueLen, int iDefTimeOut, uchar bOperFlag ) 
{ 
struct serialDef *pSer; 
struct termio termioNew; 
int i, fdIn, fdOut; 
int serHandle; 
 if( iSerNum == -1 ) // initial struct pSerial 
  { 
  for( i=0; i<MAXSERIALNUM; i++ ) 
  pSerial[i] = NULL; 
  iSerNum = 0; 
  }
              
if( iSerNum >= MAXSERIALNUM ) return (serOpenMany);
 i = 0; 
  while( i<MAXSERIALNUM && pSerial[i]!=NULL ) i++; 
  if( i >= MAXSERIALNUM ) return (serOpenMany); 
  pSerial[i] = (struct serialDef *)malloc(sizeof(struct serialDef)); 
  if( pSerial[i] == NULL ) return (serAllocMem);
              
 pSer = pSerial[i]; 
  pSer->pusInBuffer = (uchar *)malloc(uiInQueueLen); 
  if( pSer->pusInBuffer==NULL ) 
  { 
  free(pSer); 
  return (serAllocMem); 
  } 
  pSer->pusOutBuffer = (uchar *)malloc(uiOutQueueLen); 
  if( pSer->pusOutBuffer==NULL ) 
  { 
  free(pSer->pusInBuffer); 
  free(pSer); 
  return (serAllocMem); 
  } 
  pSer->uiInQueueLen = uiInQueueLen; 
  pSer->uiOutQueueLen = uiOutQueueLen;
              
serHandle = i;
 if( bOperFlag & OP_READ ) 
  { 
  if( (pSer->fpIn=fopen(pszDevName, "rb")) == NULL ) return (serOpenInFp); 
  fdIn = fileno(pSer->fpIn); 
  ioctl( fdIn, TCGETA, &termioNew ); 
  }
              
 if( bOperFlag & OP_WRITE ) 
  { 
  if( (pSer->fpOut=fopen(pszDevName, "wb")) == NULL ) return (serOpenOutFp); 
  fdOut = fileno(pSer->fpOut); 
  ioctl( fdOut, TCGETA, &termioNew ); 
  }
              
pSer->iDefTimeOut = iDefTimeOut;
/* 
  termioNew.c_iflag=0; 
  termioNew.c_oflag=0; 
  termioNew.c_lflag=0; 
  termioNew.c_line=0; 
  termioNew.c_cflag = ( 0x0CBD&~CBAUD | CTSFLOW | RTSFLOW ) ; 
  termioNew.c_cc[VEOF]=1; 
  termioNew.c_cc[VEOL]=0; 
  */
              
 termioNew.c_cflag = ( 0x0CBD&~CBAUD ) ; 
  termioNew.c_cc[VMIN] = 1; // A read operation is not satisfIEd until receive 
  // one character 
  termioNew.c_cc[VTIME] = 0; // A read operation will waiting
              
 switch( bFlowControl ) 
  { 
  case NOFLOW: 
  break; 
  case CTSRTS: 
  termioNew.c_cflag |= CTSFLOW | RTSFLOW; 
  break; 
  case XONXOFF: 
  termioNew.c_iflag |= IXON | IXOFF; 
  break; 
  default : 
  return (serFlowCtrlBad); 
  }//switch;
              
 switch( uiBaud ) 
  { 
  case 50: 
  termioNew.c_cflag|=B50; 
  break; 
  case 75: 
  termioNew.c_cflag|=B75; 
  break; 
  case 110: 
  termioNew.c_cflag|=B110; 
  break; 
  case 134: 
  termioNew.c_cflag|=B134; 
  break; 
  case 150: 
  termioNew.c_cflag|=B150; 
  break; 
  case 200: 
  termioNew.c_cflag|=B200; 
  break; 
  case 300: 
  termioNew.c_cflag|=B300; 
  break; 
  case 600: 
  termioNew.c_cflag|=B600; 
  break; 
  case 1200: 
  termioNew.c_cflag|=B1200; 
  break; 
  case 1800: 
  termioNew.c_cflag|=B1800; 
  break; 
  case 2400: 
  termioNew.c_cflag|=B2400; 
  break; 
  case 4800: 
  termioNew.c_cflag|=B4800; 
  break; 
  case 9600: 
  termioNew.c_cflag|=B9600; 
  break; 
  default: 
  return (serBaudBad); 
  }
              
 switch( bByteSize ) 
  { 
  case 5: 
  termioNew.c_cflag|=CS5; 
  break; 
  case 6: 
  termioNew.c_cflag|=CS6; 
  break; 
  case 7: 
  termioNew.c_cflag|=CS7; 
  break; 
  case 8: 
  termioNew.c_cflag|=CS8; 
  break; 
  default: 
  return (serByteSizeBad); 
  }
              
 switch( bStopBits ) 
  { 
  case 1: 
  break; 
  case 2: 
  termioNew.c_cflag|=CSTOPB; 
  break; 
  default: 
  return (serStopBitsBad); 
  }
              
 switch( bParity ) 
  { 
  case NOPARITY: 
  break; 
  case ODDPARITY: 
  termioNew.c_cflag|=PARODD; 
  break; 
  case EVENPARITY: 
  termioNew.c_cflag|=PARENB; 
  break; 
  default: 
  return (serParityBad); 
  } 
  
  termioNew.c_cflag |= CLOCAL; 
  if( bOperFlag & OP_WRITE ) 
  { 
  ioctl(fdOut, TCGETA, &pSer->termioOld); 
  ioctl(fdOut, TCSETA, &termioNew); 
  }
              
 if(bOperFlag & OP_READ) 
  { 
  ioctl( fdIn, TCGETA, &pSer->termioOld ); 
  termioNew.c_cflag|=CREAD; 
  ioctl( fdIn, TCSETA, &termioNew); 
  }
              
 if(bOperFlag & OP_READ) 
  { 
  if( setvbuf( pSer->fpIn,(char *)pSer->pusInBuffer,_IOFBF,uiInQueueLen )) 
  return (serSetInBuffer); 
  fflush(pSer->fpIn); 
  } 
  if(bOperFlag & OP_WRITE) 
  { 
  if( setvbuf(pSer->fpOut,(char *)pSer->pusOutBuffer,_IOFBF,uiOutQueueLen )) 
  return (serSetOutBuffer); 
  fflush(pSer->fpOut); 
  } 
  pSer->bOperFlag = bOperFlag;
              
iSerNum++;
 return (serHandle); 
  } 
 /************************************************************** 
Function : receive bytes from serial comport 
Param In : 
iHandle : handle returned by serOpen 
uiRecvCnt: bytes of accii buffer 
iTimeOut : timeout if equals 0 use default timeout 
Param Out : 
psBuf : ascii buffer which will be received 
Return Code: 
=0 : OK 
<0 : serTimeOut 
serRecvFail 
***************************************************************/ 
int serReceiveBuf( int iHandle, char *psBuf, uint uiRecvCnt, int iTimeOut ) 
{ 
int iCnt, iRet; 
int fdIn; 
fdIn = fileno( pSerial[iHandle]->fpIn );
 if( setjmp(tohere2) ) return (serTimeOut); 
  signal( SIGALRM, alrm2 ); 
  if( iTimeOut>0 ) alarm(iTimeOut); 
  else if( iTimeOut==0 ) alarm( pSerial[iHandle]->iDefTimeOut );
              
 for( iCnt=0; iCnt<uiRecvCnt; iCnt++ ) 
  { 
  while( ( iRet=read(fdIn,psBuf+iCnt,1) ) == 0 ); 
  if( iRet<0 ) 
  { 
  alarm(0); 
  return (serRecvFail); 
  } 
  } 
  alarm(0); 
  return (serOK); 
  }
              
标签:


