• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

急,谁知道在UNIX下用C写MODEM传输程序?给您磕头了。 (无内容)

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 21次 | 进入软件测试论坛讨论

领测软件测试网


 samhoo 回复于:2002-10-31 12:06:01
看看这个对你有没有帮助:
http://www.programmersheaven.com/zone3/cat409/

 想死你 回复于:2002-10-31 12:19:31
谢谢你,可那是DOS下的,不是UNIX下的呀。

 periscope 回复于:2002-10-31 13:11:49
在SCO5下和打开串口的tty设备进行read和write每什么区别

 想死你 回复于:2002-10-31 13:15:04
关键我不会写对TTY的控制,是和写文件一样用FILE *fp类似吗?而且一边要发送文件,另一方要会自动接收。真是没法子,请各位帮助我一下。

 mindit 回复于:2002-10-31 17:04:56
先打开串口,再用read()和write()对串口进行读写(串口接Modem),下面的函数用来打开串口:
#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
#include <fcntl.h>
OpenPort()
{
struct termio t;
int sd;
int ret;

if ((sd=open("/dev/tty1a",O_RDWR))<0) {
  printf("open serial port failure\n";
exit(-1);
  }
if ((ret=ioctl(sd,TCGETA,&t))<0) {
printf("ioctl failure\n";
close(sd);
exit(-1);
  }
t.c_lflag=0; 
t.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
t.c_iflag= BRKINT | IGNPAR | IGNCR | IXON | IXOFF | IXANY ;
t.c_oflag=02;
t.c_line=0;
t.c_cc[7]=255;
t.c_cc[4]=0;
t.c_cc[5]=0;
if ((ret=ioctl(sd,TCSETA,&t))<0) {
printf("ioctl failure\n";
close(sd);
exit(-1);
  }

}

 mindit 回复于:2002-10-31 17:07:34
修改:
#include <stdlib.h>
#include <termio.h>
#include <fcntl.h>
int OpenPort()
{
struct termio t;
int sd;
int ret;
if ((sd=open("/dev/tty1a",O_RDWR))<0) {
 printf("open serial port failure\n";
exit(-1);
 }
if ((ret=ioctl(sd,TCGETA,&t))<0) {
printf("ioctl failure\n";
close(sd);
exit(-1);
 }
t.c_lflag=0; 
t.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
t.c_iflag= BRKINT | IGNPAR | IGNCR | IXON | IXOFF | IXANY ;
t.c_oflag=02;
t.c_line=0;
t.c_cc[7]=255;
t.c_cc[4]=0;
t.c_cc[5]=0;
if ((ret=ioctl(sd,TCSETA,&t))<0) {
printf("ioctl failure\n";
close(sd);
exit(-1);
 }
return(sd);

 



 maizhi 回复于:2002-10-31 17:12:29
用socket通讯试试

 kk1978 回复于:2002-10-31 19:15:39
首先要打开串口,然后通过串口来向modem发at指令来进行通讯,编程的时候要特别注意要用适当的方式打开串口,其实对TTY的操作跟一般的文件操作没有特别的区别,区别就是在于串口通讯需要设置串口属性.

 kk1978 回复于:2002-10-31 19:17:08
/**************************************************************
 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);
}

 kk1978 回复于:2002-10-31 19:20:40
/**************************************************************
 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);
}

 想死你 回复于:2002-10-31 20:19:24
非常感谢,我去试试。:)))

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网