打印
[DemoCode下载]

单片机串口接收发送函数

[复制链接]
860|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
E-Kaia|  楼主 | 2016-5-9 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***********************************************************************************
*   标题:                  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  


沙发
gejigeji521| | 2016-5-9 22:49 | 只看该作者
是在哪个里面实现的printf函数,是系统自带的吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

100

帖子

0

粉丝