📄 gprs232.cpp
字号:
/*//////////////////////////////////////////////////////////////////////////
Description: The program implements a transparent data transfer between a
RS232 based device and a remote server on internet.
//////////////////////////////////////////////////////////////////////////*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <time.h>
#include <dos.h>
#include <math.h>
#include "etr_ppp.h"
#include "gprs.h"
#include "RS232X3.h"
#include "etr232i.h"
#include "readini.h"
#include "tcpclnt.h"
#define BUFSIZE 1500
#define MAXECNT 3
unsigned char TmpBuf[1536];
struct SERVER_ID Svr_ID;
int ComIdx, BaudIdx;
long Timeout;
int ECNT=0;
int GetIniPara( );
// return = 0: data is unavailable
// > 0: data is available, and in pDat
int RS232GetData( int PortNum, char* pDat, int len );
int RS232SendData( int PortNum, char* pDat, int len );
void main( int argc, char** argv )
{
int i1, len, HIdx, ErrFlg;
CONN_STATE TCPState=0;
PPPGPRSState PPPState;
class TCPClientManager* TCPManager;
_Init:
// get config parameters
GetIniPara( );
InitUART( ComIdx, BaudIdx ); // init RS232 COM
InstallISR( ComIdx );
TCPManager = new TCPClientManager( );
TCPManager->Init( &Svr_ID );
for( ErrFlg=0, HIdx=0; ; )
{
// keep PPP connection
PPPState = PPP_Running( );
if( PPPState!=PPPLINKUP )
{
printf( "RIdx=%d\r", PPPState );
continue;
}
// keep TCP connection
TCPState = TCPManager->Running( );
if( TCPState!=OPEN ) continue;
// read Data from tcp connection
len = TCPManager->ReadData( TmpBuf, BUFSIZE );
if( len > 0 ) // remote data available
{
TmpBuf[len]='\0';
printf( "TCP_RCV:%s", TmpBuf );
RS232SendData( ComIdx, TmpBuf, len ); // forward data to device by RS232
TCPManager->SetTimeoutCnt( HeartBeat );
}
// read data from RS232 if available
len = RS232GetData( ComIdx, TmpBuf, BUFSIZE );
if( len > 0 ) // RS232 data available
{
TmpBuf[len]='\0';
printf( "232_RCV:%s", TmpBuf );
i1 = TCPManager->WriteData( TmpBuf, len ); // forward data to remote by TCP
TCPManager->SetTimeoutCnt( HeartBeat );
}
// timeout processing
if( TCPManager->IsTimeout( ) )
{
// send heart beat
sprintf( TmpBuf, "Heartbeat CNT=%d", HIdx );
HIdx++;
i1 = strlen( TmpBuf );
TCPManager->WriteData( TmpBuf, i1 );
TCPManager->SetTimeoutCnt( HeartBeat );
}
if( ErrFlg == 0 ) continue;
ErrFlg = 0;
TCPManager->Close( );
PPP_Restart( ); // restart PPP if necessary
ECNT++;
if( ECNT > MAXECNT ) break;
}
UninstallISR( ComIdx );
delete TCPManager;
goto _Init;
}
int GetIniPara( )
{
int i1;
if( ReadIni.GetField( "Config.ini", "[CONFIG]", "RemoteIP", 0, Svr_ID.IPStr ) )
strcpy( Svr_ID.IPStr, "61.157.21.1" );
if( ReadIni.GetField( "Config.ini", "[CONFIG]", "RemotePort", 0, Svr_ID.Port ) )
Svr_ID.Port = 1001;
if( ReadIni.GetField( "Config.ini", "[CONFIG]", "COM", 0, ComIdx ) )
ComIdx = 2;
if( ReadIni.GetField( "Config.ini", "[CONFIG]", "BaudIdx", 0, BaudIdx ) )
BaudIdx = 12;
return 0;
}
// return = 0: data is unavailable
// > 0: data is available, and in pDat
int RS232GetData( int PortNum, char* pDat, int len )
{
int i, i1;
for( i=0; i<len; )
{
NB_Delay(1);
i1 = GetInputData( PortNum );
if( i1!=-1 )
{
pDat[i] = (char)i1;
i++;
}
else break;
}
return i;
}
int RS232SendData( int PortNum, char* pDat, int len )
{
int i;
for( i=0; i<len; i++ )
{
PutOutputData( PortNum, pDat[i] );
}
StartSend( PortNum );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -