📄 sim232.c
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
/*fosc=11.0592MHZ*/
#define RECBUFSIZE 12
//----------------------------------------------------------------------
sbit RXD2 = P1^6;
sbit TXD2 = P1^7;
//----------------------------------------------------------------------
//-------------------------------------------------------------
void delay(unsigned int ms);
//-------------------------------------------------------------
bit sendflag;
unsigned char TMR_COUNT;
unsigned char RecBuffer1[RECBUFSIZE];
unsigned char RecBuffer2[RECBUFSIZE];
unsigned char RecBuf1_In,RecBuf1_Out,RecBuf2_In,RecBuf2_Out;
#define PURGEBUFFER1 {RecBuf1_In = RecBuf1_Out ; }
#define PURGEBUFFER2 {RecBuf1_In = RecBuf1_Out ; }
int InitCommPort(void);
unsigned char ReceiveByte(unsigned char * val );
unsigned char SendByte(unsigned char val);
void simSendchar(unsigned char val);
unsigned char simrecchar(unsigned char * val);
void SimSendStrFrame(char * kindstr,char * infostr);
unsigned char Infostr[9];
unsigned char DEVICEID[9];
#define GPSEAST 0
#define GPSNORTH 1
#define DEVICESPEED 2
#define GPSDATE 3
#define GPSTIME 4
//unsigned char GPSEast[9];
//unsigned char GPSNorth[9];
//unsigned char DeviceSpeed[6];
//unsigned char GPSDate[7];
//unsigned char GPSTime[7];
void PutSimRecBuffer(unsigned char recval);
unsigned char GetSimReceiveByte(unsigned char * val);
unsigned char CheckSimUartCMD(void);
unsigned char GetGPSData(unsigned char kind);
void main(void)
{
unsigned char temp1;
InitCommPort();
while(1)
{
if ( simrecchar(&temp1) ==1 ) PutSimRecBuffer(temp1);
if (CheckSimUartCMD()==1)
{
//infostr ascii
//unsigned char DEVICEID[9];
SimSendStrFrame('A', DEVICEID);
//unsigned char GPSEast[9];
GetGPSData(GPSEAST);
SimSendStrFrame('E',Infostr);
//unsigned char GPSNorth[9];
GetGPSData(GPSNORTH);
SimSendStrFrame('N',Infostr);
//unsigned char DeviceSpeed[6];
GetGPSData(DEVICESPEED);
SimSendStrFrame('S',Infostr);
//unsigned char GPSDate[7];
GetGPSData(GPSDATE);
SimSendStrFrame('D',Infostr);
//unsigned char GPSTime[7];
GetGPSData(GPSTIME);
SimSendStrFrame('T',Infostr);
}
}
}
int InitCommPort(void)
{
RecBuf1_In=0; RecBuf1_Out=0;
RecBuf2_In=0; RecBuf2_Out=0;
TMR_COUNT = 0;
sendflag =0;
/*Timer 1 is being used to generate baud rates.*/
SCON = 0X50;
TMOD = 0X21;
TH1= 0xfa ;
TL1= 0xfa ; //4800 , n, 8, 1
TH0=0xdb;
TL0=0xff; /*10ms timer*/
TR0=0;
TR1 =1;
PS=1;
ES=1;
ET0=0;
EA=1;
RI = 0;
return 0;
}
void Serial_vector(void) interrupt 4 using 1
{
unsigned char aTempVal;
if(RI)
{
aTempVal=SBUF; RI=0;
RecBuffer1[RecBuf1_In]=aTempVal;
if(++RecBuf1_In==RECBUFSIZE) RecBuf1_In=0;
}
else
{
TI =0;
sendflag = 0;
}
}
void Timer0_vector(void)interrupt 1 using 2 //10ms interrupt
{
TH0=0xdb;
TL0=0xff;
TMR_COUNT++;
}
unsigned char SendByte(unsigned char val)
{
while (sendflag==1);
SBUF = val ;
sendflag = 1;
return 1;
}
unsigned char ReceiveByte(unsigned char * val)
{
if (RecBuf1_Out==RecBuf1_In) return 0 ;
*val = RecBuffer1[RecBuf1_Out];
if (++RecBuf1_Out==RECBUFSIZE) RecBuf1_Out=0;
return 1;
}
unsigned char GetGPSData(unsigned char kind)
{
// ask Gps module
switch ( kind)
{
case GPSEAST :
break;
case GPSNORTH :
break;
case DEVICESPEED:
break;
case GPSDATE :
break;
case GPSTIME :
break;
}
// must check time out
return 0;
}
unsigned char CheckSimUartCMD(void)
{
data short int temp_RecBuf2_Out ;
unsigned char i,val,tempstr[4];
bit findcmd ;
tempstr[0]='G';
tempstr[1]='C';
tempstr[2]='P';
tempstr[3]='M';
findcmd = 0;
temp_RecBuf2_Out = RecBuf2_Out ; //check 'GCPM' in RecBuffer2[RECBUFSIZE];
i=0;
while (1)
{
if (GetSimReceiveByte(&val)== 1)
{
if ( i<4)
{
if (val !=tempstr[i])
temp_RecBuf2_Out = RecBuf2_Out;
}
else
if (val =='#' )
{
findcmd = 1;
break;
}
}
else break;
i++;
}
RecBuf2_Out = temp_RecBuf2_Out ;
//---------------------------
//mp rec data
//---------------------------
if (findcmd == 1 ) return 1 ;
else return 0;
}
void PutSimRecBuffer(unsigned char recval)
{
RecBuffer2[RecBuf2_In]=recval;
if(++RecBuf2_In==RECBUFSIZE) RecBuf2_In=0;
}
unsigned char GetSimReceiveByte(unsigned char * val)
{
if (RecBuf2_Out==RecBuf2_In) return 0 ;
*val = RecBuffer2[RecBuf2_Out];
if (++RecBuf2_Out==RECBUFSIZE) RecBuf2_Out=0;
return 1;
}
void SimSendStrFrame(char * kindstr,char * infostr)
{
while ( *kindstr>0)
{
simSendchar(*kindstr);
kindstr++;
}
while ( *infostr>0)
{
simSendchar(*infostr);
infostr++;
}
}
#define delaynop10m() { TL0=0x1c; TH0=0xfd; TR0=1; TF0=0; while(TF0==0) ; TR0=0 ;}
#define delaynop03m() { TL0=0x00; TH0=0xff; TR0=1; TF0=0; while(TF0==0) ; TR0=0 ;}
//1200,n,8,1
void simSendchar(unsigned char val)
{
short int i =8;
EA=0;
TXD2 = 0;
delaynop10m()
for (i = 0; i<8 ;i++)
{
if(( val>>i)&0x1) TXD2 = 1;
else TXD2 = 0;
delaynop10m()
}
TXD2 = 1;
delaynop10m()
TXD2 = 1;
EA=1;
}
unsigned char simrecchar(unsigned char * val)
{
unsigned char aa;
short int i =8;
if (RXD2 ==1 ) return 0;
delaynop03m()
if (RXD2 ==1 ) return 0;
delaynop03m()
if (RXD2 ==1 ) return 0;
for ( ; i>0; i--)
{
delaynop10m()
aa=(aa>>1)&0x7f;
if (RXD2 ==1 ) aa |=0x80;
}
delaynop10m()
if (RXD2 ==0 ) return 0;
*val =aa;
return 1;
}
void delay(unsigned int ms)
{
unsigned int i;
TMOD|=0x01;
TR0=1;
if(ms>=10)
{
i=ms/10;
ms%=10;
for( ; i>0; i--)
{
TL0=0x00;
TH0=0xdc;
TF0=0;
while(TF0==0) ;
}
}
for( ; ms>0; ms--)
{
TL0=0x67;
TH0=0xfc;
TF0=0;
while(TF0==0) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -