单片机串口接收发送函数

/***********************************************************************************
*	标题:                  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


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值