分享
 
 
 

UNIX下用C写MODEM传输程序

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有