庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>SCO UNIX>系统管理>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

UNIX下用C写MODEM传输程序

 作者:本站收集   日期:2005-3-13
字号选择〖 〗/ 双击滚屏 单击停止   


首先要打开串口,然后通过串口来向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);
}

上一篇:informix online 的三种备份方法    下一篇:SCO限制ROOT用户远程登录的几种方法  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-3-13
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿