51串口通讯程序
我的串口通讯程序,你试试:
#include <reg52.h>
#define MAX 6//定义缓冲区大小
#define uchar unsigned char
struct ComStruct{
uchar SentComBuffer[MAX];//发送缓冲区:环状
uchar ReceiveComBuffer[MAX];//接收缓冲区
uchar ReceiveCount,SentCount;//收发的有效数据数
uchar ReceiveStart,ReceiveEnd,SentStart,SentEnd;//当前读写起始与结束位置
uchar IsSentting;//正在发送过程中1:发送,0未发送
};
struct ComStruct ComInstance;
uchar st=0,bb;
/*——————————————*/
/* //初始化缓冲区,所有数据置0或初值–Begin
/*——————————————*/
void IniBuffer(void)
{
char i;
for(i=0;i<MAX;i++){
ComInstance.ReceiveComBuffer[i]=0;
ComInstance.SentComBuffer[i]=0;
}
ComInstance.SentCount=0;
ComInstance.ReceiveCount=0;
ComInstance.ReceiveStart=0;
ComInstance.ReceiveEnd=0;
ComInstance.SentStart=0;
ComInstance.SentEnd=0;
ComInstance.IsSentting=0;
}
/*——————————————*/
/* //初始化缓冲区,所有数据置0或初值–End
/*——————————————*/
/*——————————————*/
/* //初始化串口–Begin
/*——————————————*/
void comini(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
//SMOD=0;
TH1 = 0xFd; //Baud:9600 fosc=11.0592MHz
TL1 = 0xF4;
IE = 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
}
/*——————————————*/
/* //初始化串口–End
/*——————————————*/
uchar sent(char *b,char n)//发送的字节数=发送(字符串指针,字符个数)
{
uchar i;
/*
if(n>MAX-ComInstance.SentCount)//缓冲区字节不够拒绝发送返回0
{return 0;}
*/
for(i=0;i<n;i++)
{
ComInstance.SentComBuffer[ComInstance.SentEnd]=b[i];//向缓冲区尾部拷贝字符
ComInstance.SentEnd++;//尾部指针++
ComInstance.SentCount++;//缓冲区总字节数++
if(ComInstance.SentEnd>MAX)//循环利用缓冲区
ComInstance.SentEnd=0;
//if(ComInstance.SentCount>=MAX)//达到最大值就退出(单线程程序不会达到最大值)
//break;
}
if(ComInstance.IsSentting==0)//如果不在发送状态就开始发送
{
SBUF=ComInstance.SentComBuffer[ComInstance.SentStart];//发送第一个字节
ComInstance.SentStart++;//字节后移
ComInstance.IsSentting=1;//发送标志置一
ComInstance.SentCount–;//总字节–
}
return i;//返回复制到缓冲区的字节数
}
void sentoff(void)//等待发送完成,也可以发送开始就执行代码以提高效率,有些交互式需要等待发送完成才能读取输入。
{
while(ComInstance.SentCount!=0);//等待发送总数为0
}
void serial () interrupt 4 using 3
{
if(RI)
{
RI=0;
if(ComInstance.ReceiveCount<MAX)//缓冲区满后字节被丢弃
{
ComInstance.ReceiveCount++;
ComInstance.ReceiveComBuffer[ComInstance.ReceiveEnd]=SBUF;//不满则读入
ComInstance.ReceiveEnd++;
if(ComInstance.ReceiveEnd>MAX)//循环利用缓冲区
ComInstance.ReceiveEnd=0;
}
if(ComInstance.ReceiveCount==MAX)st=1;
}//if(RI)
/////////////////////////////////////////////////////////
if(TI)
{
TI=0;
if(ComInstance.SentCount>0)//如有数据则发送,并设置相关标志字
{
SBUF=ComInstance.SentComBuffer[ComInstance.SentStart];
ComInstance.SentStart++;
if( ComInstance.SentStart>MAX)
ComInstance.SentStart=0;
ComInstance.SentCount–;
}
else
ComInstance.IsSentting=0;//否则设置停止发送字
}
}
void main()//主函数
{
uchar *pp;
comini();
IniBuffer();
sent(“@star#\n”,6);
sentoff();
pp=ComInstance.ReceiveComBuffer;
do
{
if(st==1)
{st=0;
sentoff();
sent(pp,MAX);
sentoff();
IniBuffer();
}
} while(1);
}