您的位置:首页 > 其它

单片机串口接收发送函数

2016-01-03 11:12 411 查看
/***********************************************************************************
*	标题:                  RS232串口通信试验                                        *
*	功能:串口接收数据后打印,按回车键处理命令,通过数组储存命令				    *
*	      按 退格键 会准确地删除一位数据并清除串口的显示,尝试使用串口命令来清屏    *
*************************************************************************************/

#include <REG52.H>

sbit BEEP = P1^4;
sbit JDQ1 = P1^1;
sbit JDQ2 = P1^2;

bit Flag;
bit Flag_comm;
unsigned char ReData[5],SenData[5];	//接收数据缓存,发送数据缓存	,不指定大小会waring,应该是怕溢出
unsigned char serial_receive[64];   //接收命令的数组

static unsigned char coun = 0;

void serial_print(char *str){
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI);
TI = 0;
i++;
}
}

//串口初始化,初始化函数需要改进,修改为自动计算配置
void serial_init(){
SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20;      //定时器工作方式2
PCON|= 0x80;
TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
//	TH1 = 0xF3;					// //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1  = 1;
}

//主函数,串口接收完整指令后解析执行命令
void main (void) {
serial_init();    //串口初始化要加入配置
ES   = 1;        //开串口中断
EA   = 1;        // 开总中断

serial_print("\n\rserial_init,waiting for input:\n\r");
serial_print("common  input:");
while(1)
{
if(Flag_comm == 1){
serial_print("\n\r");
serial_print("receive common:");
serial_print(serial_receive);
serial_print("\n\r");
//这里将传入参数进行命令解析
//solve(serial_receive);
serial_print("excuseing !!!!!!!!!!!!\n\r");
serial_print("common  input:");
coun = 0;   //打印后清零串口计数
Flag_comm = 0;	//处理命令后清除标志位
}
}
}

/****************************************************
串口中断程序
******************************************************/
void serial_interrupt (void) interrupt 4 using 1
{
if(RI == 1)        //RI接受中断标志
{
RI = 0;		    //清除RI接受中断标志
Flag=1;		    //接收到数据
*ReData = SBUF;  //SUBF接受/发送缓冲器
*SenData = *ReData;
if( *ReData != 0x0d ){	   //等待接收回车
if( *ReData == 0x08 ){	 //退格键
serial_receive[--coun] = '\0';//遇到退格键要把刚刚的值清0,所以是--coun
serial_print("\b ");               //覆盖掉原来的值
}else{
serial_receive[coun++] = *ReData;
}
}else{
serial_receive[coun] = '\0';	 //遇到回车键,写\0,字符串终止
Flag_comm = 1;					 //接收命令完成,解析命令
}
}
if(Flag == 1){		 //接收到字符就打印,避免存在输入过快无法显示
serial_print(SenData);
Flag = 0;
}
}
//0x0d = \r 0x0a = \n	0x08 = \b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  串口