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);

}

版权声明:本文为cloudstep原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cloudstep/articles/1387394.html