#include <AT89X52.H>
#include <stdio.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define UART_BUFLEN 40
#define DelayT 5000
uchar UART_BUF[UART_BUFLEN];
uchar UART_pWrite=0;
uchar UART_pRead=0;
bit UART_UpdateFlag=0;
bit UART_OverFlowFlag=0;
bit UART_LoopFlag=0;
bit Sending=0;
struct MSG
{
uchar DataLenght;
uchar DeviceAdd;
uchar COMID;
uchar Ports;
uchar PortsAttr;
uchar OPVal[30];
};
void Rs232_Init(void)
{
SCON=0x50; // URAT 工作于模式1,1位起始位,1位停止位,8位数据位,REN=1
TMOD=(TMOD&0x0F)|0x20; // Timer 1 工作于模式2
PCON&=0X7F; // SMOD=0
TH1=0xFA; // 波特率9600 bds at 22.1184MHZ
TL1=0xFA; // 波特率9600 bds at 22.1184MHZ
ES=1; // 串口中断使能 IE
TR1=1; // 启动Timer1
EA=1;
TI=0;
ODDEVENFlage=0;
}
uchar ReadUartBuf()
{
uchar Buffer_Value;
Buffer_Value=UART_BUF[UART_pRead];
UART_pRead++;
if(UART_pRead==UART_BUFLEN)
{
UART_pRead=0;
UART_LoopFlag=0;
}
if((UART_pRead==UART_pWrite)&&(!UART_LoopFlag))
UART_UpdateFlag=0;
if(UART_OverFlowFlag)
UART_OverFlowFlag=0;
return Buffer_Value;
}
void RS232_SendData(uchar Sdata) // 采用查询发送。
{
uint Count=0,Count1=0;
Sending=0;
do{
if(TI==0)
{
if(ODDEVENFlage!=0)
{
ACC=Sdata;
TB8=P;
//openled();
}
SBUF=Sdata;
Sending=1;
while(!TI) {Count1++; if(Count1>1000) break;}
TI=0;
Sending=0;
}
Count++;
if(Count>1000) { TI=0; break; }
}while(TI);
}
void serial_IT(void) interrupt SIO_VECTOR
{
EA=0;
if(RI==1)
{ // speaker();
RI=0;
if((UART_pWrite>=UART_pRead)&&(UART_LoopFlag==1))
UART_OverFlowFlag=1; // 满丢失数据。
else
{UART_BUF[UART_pWrite]=SBUF;
UART_UpdateFlag=1;
UART_pWrite++;
if(UART_pWrite==UART_BUFLEN)
{
UART_pWrite=0;
UART_LoopFlag=1;
}
}
}
if(TI==1)
{
//speaker();
if(Sending==0) TI=0;
}
EA=1;
}
bit Data_Anal(struct MSG *UartMSGP)//从缓冲中读出数据;并转换为需要的格式.
// 每读一个数据需要检测 UART_UpdateFlag 是否为真;
{
uint i=0;uchar k=0;
//openled();
if(!UART_UpdateFlag)
return 0;
if(ReadUartBuf()!=0xAA) // 不是起始位丢掉数据
return 0 ;
....
}
//如发送字符串"http://www.gzyueda.com";
code char string[]="http://www.gzyueda.com";
char *StrIp;
int StrLenght=strlen("http://www.gzyueda.com");
StrIp=(char*)string;
int i;
for(i=0;i<strLenght;i++)
{
RS232_SendData(*(strIp++));
}