51单片机串口通信问题

我用串口调试助手向单片机发送一个字符串(比如OK),然后我程序里面如何判断接收的是否是发送过来的字符串!
新手虚心求教,最好有代码,可以更容易理解!

第1个回答  2013-03-08
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbit K1=P3^2; //对应开发板K1按键
/*-------------------------------------------------------------*/
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}

void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}

}
}

/*-------------------------------------------------------------*/
//串口发送一个字节
void Uart_SendChar(unsigned char dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}

/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{ uchar
i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];
while(!TI);
TI=0;
i++;
}
}

/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
if(K1==0)
{
delay1ms(20);
if(K1==0)
{
Uart_SendString(); //发送数据
while(!K1); //等待按键释放
}
}
}
}

/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char Rcv = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
P0=SBUF;
Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示
}
}追问

if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
P0=SBUF;
Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示
你这个地方是一次接收一个数据是吧,那如果我一次要接收一个字符串呢,比如OK

追答

你直接发送一个字符串,在接收后返回的依然是一个相同的字符串!
这个只限定是你发送数据,单片机原封不动的把数据返回。

如果你单片机主动的要发送一个字符串,
可以自己写一个代码!;
void Uart_SendString()
{ uchar
i=0;
while(trdata[i]!=‘\0’)
{
SBUF=trdata[i];
while(!TI);
TI=0;
i++;
}
}

//trdata[i]是你自己定义的。这种方式可以用很多种写法来实现

追问

我的意思是:比如说我发送一个字符串给单片机,接收程序怎么写,
是不是:trdata[i++]=SBUF; 然后我怎么把trdata[i++]数组里面的值赋值给一个字符型变量uchar back_dat;去做比较?

第2个回答  推荐于2016-04-03
C51单片机的程序:
1、初始化程序:
TMOD=0X20; TH1=0Xfd; TL1=0Xfd;SM0=0; SM1=1; REN=1; TR1=1; EA=1; ES=1;
2、发送程序:
void comdata_send()//串口发送数据
{
unsigned char i;
SBUF=0x2A;
while(!TI);
TI=0;
}
3、接收数据:
void comdata_receive() interrupt 4
{ if(RI)
{ RI=0;
RS485_data=SBUF;
}
}本回答被提问者和网友采纳
相似回答