免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4903 | 回复: 11
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2002-10-31 11:31 |只看该作者 |倒序浏览

论坛徽章:
0
2 [报告]
发表于 2002-10-31 12:06 |只看该作者

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

看看这个对你有没有帮助:
http://www.programmersheaven.com/zone3/cat409/

论坛徽章:
0
3 [报告]
发表于 2002-10-31 12:19 |只看该作者

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

谢谢你,可那是DOS下的,不是UNIX下的呀。

论坛徽章:
0
4 [报告]
发表于 2002-10-31 13:11 |只看该作者

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

在SCO5下和打开串口的tty设备进行read和write每什么区别

论坛徽章:
0
5 [报告]
发表于 2002-10-31 13:15 |只看该作者

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

关键我不会写对TTY的控制,是和写文件一样用FILE *fp类似吗?而且一边要发送文件,另一方要会自动接收。真是没法子,请各位帮助我一下。

论坛徽章:
0
6 [报告]
发表于 2002-10-31 17:04 |只看该作者

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

先打开串口,再用read()和write()对串口进行读写(串口接Modem),下面的函数用来打开串口:
#include <stdio.h>;
#include <stdlib.h>;
#include <termio.h>;
#include <fcntl.h>;
OpenPort()
{
struct termio t&#59;
int sd&#59;
int ret&#59;

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

}

论坛徽章:
0
7 [报告]
发表于 2002-10-31 17:07 |只看该作者

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

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


论坛徽章:
0
8 [报告]
发表于 2002-10-31 17:12 |只看该作者

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

用socket通讯试试

论坛徽章:
0
9 [报告]
发表于 2002-10-31 19:15 |只看该作者

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

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

论坛徽章:
0
10 [报告]
发表于 2002-10-31 19:17 |只看该作者

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

/**************************************************************
Function        : open serial comport
Param In        :
   pszDevName    : comport device name, eg.&quot;/dev/tty1a&quot;
   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&#59;
   struct termio termioNew&#59;
   int i, fdIn, fdOut&#59;
   int serHandle&#59;

   if( iSerNum == -1 )   // initial struct pSerial
   {
      for( i=0&#59; i<MAXSERIALNUM&#59; i++ )
pSerial = NULL&#59;
      iSerNum = 0&#59;
   }

   if( iSerNum >;= MAXSERIALNUM )   return (serOpenMany)&#59;

   i = 0&#59;
   while( i<MAXSERIALNUM &amp;&amp; pSerial!=NULL )  i++&#59;
   if( i >;= MAXSERIALNUM )   return (serOpenMany)&#59;
   pSerial = (struct serialDef *)malloc(sizeof(struct serialDef))&#59;
   if( pSerial == NULL )   return (serAllocMem)&#59;

   pSer = pSerial&#59;
   pSer->;pusInBuffer = (uchar *)malloc(uiInQueueLen)&#59;
   if( pSer->;pusInBuffer==NULL )
   {
      free(pSer)&#59;
      return (serAllocMem)&#59;
   }
   pSer->;pusOutBuffer = (uchar *)malloc(uiOutQueueLen)&#59;
   if( pSer->;pusOutBuffer==NULL )
   {
      free(pSer->;pusInBuffer)&#59;
      free(pSer)&#59;
      return (serAllocMem)&#59;
   }
   pSer->;uiInQueueLen = uiInQueueLen&#59;
   pSer->;uiOutQueueLen = uiOutQueueLen&#59;

   serHandle = i&#59;

   if( bOperFlag &amp; OP_READ )
   {
      if( (pSer->;fpIn=fopen(pszDevName, &quot;rb&quot) == NULL ) return (serOpenInFp)&#59;
      fdIn = fileno(pSer->;fpIn)&#59;
      ioctl( fdIn, TCGETA, &amp;termioNew )&#59;
   }

   if( bOperFlag &amp; OP_WRITE )
   {
      if( (pSer->;fpOut=fopen(pszDevName, &quot;wb&quot) == NULL ) return (serOpenOutFp)&#59;
      fdOut = fileno(pSer->;fpOut)&#59;
      ioctl( fdOut, TCGETA, &amp;termioNew )&#59;
   }

   pSer->;iDefTimeOut = iDefTimeOut&#59;

/*
   termioNew.c_iflag=0&#59;
   termioNew.c_oflag=0&#59;
   termioNew.c_lflag=0&#59;
   termioNew.c_line=0&#59;
   termioNew.c_cflag = ( 0x0CBD&amp;~CBAUD | CTSFLOW | RTSFLOW ) &#59;
   termioNew.c_cc[VEOF]=1&#59;
   termioNew.c_cc[VEOL]=0&#59;
*/

   termioNew.c_cflag = ( 0x0CBD&amp;~CBAUD ) &#59;
   termioNew.c_cc[VMIN] = 1&#59;  // A read operation is not satisfied until receive
      // one character
   termioNew.c_cc[VTIME] = 0&#59; // A read operation will waiting

   switch( bFlowControl )
   {
      case NOFLOW:
break&#59;
      case CTSRTS:
termioNew.c_cflag |= CTSFLOW | RTSFLOW&#59;
break&#59;
      case XONXOFF:
termioNew.c_iflag |= IXON | IXOFF&#59;
break&#59;
      default :
return (serFlowCtrlBad)&#59;
   }//switch&#59;

   switch( uiBaud )
   {
      case 50:
termioNew.c_cflag|=B50&#59;
break&#59;
      case 75:
         termioNew.c_cflag|=B75&#59;
break&#59;
      case 110:
termioNew.c_cflag|=B110&#59;
break&#59;
      case 134:
termioNew.c_cflag|=B134&#59;
break&#59;
      case 150:
termioNew.c_cflag|=B150&#59;
break&#59;
      case 200:
termioNew.c_cflag|=B200&#59;
break&#59;
      case 300:
termioNew.c_cflag|=B300&#59;
break&#59;
      case 600:
termioNew.c_cflag|=B600&#59;
break&#59;
      case 1200:
termioNew.c_cflag|=B1200&#59;
break&#59;
      case 1800:
termioNew.c_cflag|=B1800&#59;
break&#59;
      case 2400:
termioNew.c_cflag|=B2400&#59;
break&#59;
      case 4800:
termioNew.c_cflag|=B4800&#59;
break&#59;
      case 9600:
termioNew.c_cflag|=B9600&#59;
break&#59;
      default:
return (serBaudBad)&#59;
   }

   switch( bByteSize )
   {
      case 5:
         termioNew.c_cflag|=CS5&#59;
         break&#59;
      case 6:
         termioNew.c_cflag|=CS6&#59;
         break&#59;
      case 7:
         termioNew.c_cflag|=CS7&#59;
         break&#59;
      case 8:
         termioNew.c_cflag|=CS8&#59;
         break&#59;
      default:
         return (serByteSizeBad)&#59;
   }

   switch( bStopBits )
   {
      case 1:
         break&#59;
      case 2:
         termioNew.c_cflag|=CSTOPB&#59;
         break&#59;
      default:
         return (serStopBitsBad)&#59;
   }

   switch( bParity )
   {
      case NOPARITY:
         break&#59;
      case ODDPARITY:
         termioNew.c_cflag|=PARODD&#59;
         break&#59;
      case EVENPARITY:
         termioNew.c_cflag|=PARENB&#59;
         break&#59;
      default:
         return (serParityBad)&#59;
   }
  
   termioNew.c_cflag |= CLOCAL&#59;
   if( bOperFlag &amp; OP_WRITE )
   {
      ioctl(fdOut, TCGETA, &amp;pSer->;termioOld)&#59;
      ioctl(fdOut, TCSETA, &amp;termioNew)&#59;
   }

   if(bOperFlag &amp; OP_READ)
   {
      ioctl( fdIn, TCGETA, &amp;pSer->;termioOld )&#59;
      termioNew.c_cflag|=CREAD&#59;
      ioctl( fdIn, TCSETA, &amp;termioNew)&#59;
   }

   if(bOperFlag &amp; OP_READ)
   {
      if( setvbuf( pSer->;fpIn,(char *)pSer->;pusInBuffer,_IOFBF,uiInQueueLen ))
         return (serSetInBuffer)&#59;
      fflush(pSer->;fpIn)&#59;
   }
   if(bOperFlag &amp; OP_WRITE)
   {
      if( setvbuf(pSer->;fpOut,(char *)pSer->;pusOutBuffer,_IOFBF,uiOutQueueLen ))
         return (serSetOutBuffer)&#59;
      fflush(pSer->;fpOut)&#59;
   }
   pSer->;bOperFlag = bOperFlag&#59;

   iSerNum++&#59;

   return (serHandle)&#59;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP