[DemoCode下载] 单片机串口接收发送函数

[复制链接]
1092|1
 楼主| E-Kaia 发表于 2016-5-9 17:37 | 显示全部楼层 |阅读模式
  1. /***********************************************************************************
  2. *   标题:                  RS232串口通信试验                                        *           
  3. *   功能:串口接收数据后打印,按回车键处理命令,通过数组储存命令                  *
  4. *         按 退格键 会准确地删除一位数据并清除串口的显示,尝试使用串口命令来清屏    *
  5. *************************************************************************************/  

  6. #include <REG52.H>  

  7. sbit BEEP = P1^4;  
  8. sbit JDQ1 = P1^1;  
  9. sbit JDQ2 = P1^2;  

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

  14. static unsigned char coun = 0;  

  15. void serial_print(char *str){  
  16.     unsigned char i = 0;  
  17.     while(str[i] != '\0')  
  18.     {  
  19.          SBUF = str[i];  
  20.          while(!TI);  
  21.          TI = 0;  
  22.          i++;  
  23.     }  
  24. }  

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

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

  40.     serial_print("\n\rserial_init,waiting for input:\n\r");  
  41.     serial_print("common  input:");  
  42.     while(1)  
  43.     {   
  44.         if(Flag_comm == 1){  
  45.             serial_print("\n\r");  
  46.             serial_print("receive common:");  
  47.             serial_print(serial_receive);  
  48.             serial_print("\n\r");  
  49.             //这里将传入参数进行命令解析  
  50.             //solve(serial_receive);  
  51.             serial_print("excuseing !!!!!!!!!!!!\n\r");  
  52.             serial_print("common  input:");  
  53.             coun = 0;   //打印后清零串口计数   
  54.             Flag_comm = 0;  //处理命令后清除标志位  
  55.         }  
  56.     }  
  57. }  

  58. /****************************************************  
  59.                串口中断程序  
  60. ******************************************************/  
  61. void serial_interrupt (void) interrupt 4 using 1  
  62. {  
  63.     if(RI == 1)        //RI接受中断标志  
  64.     {  
  65.         RI = 0;         //清除RI接受中断标志  
  66.         Flag=1;         //接收到数据  
  67.         *ReData = SBUF;  //SUBF接受/发送缓冲器  
  68.         *SenData = *ReData;  
  69.         if( *ReData != 0x0d ){     //等待接收回车  
  70.             if( *ReData == 0x08 ){   //退格键  
  71.                 serial_receive[--coun] = '\0';//遇到退格键要把刚刚的值清0,所以是--coun  
  72.                 serial_print("\b ");               //覆盖掉原来的值  
  73.             }else{  
  74.                 serial_receive[coun++] = *ReData;  
  75.             }  
  76.         }else{  
  77.             serial_receive[coun] = '\0';     //遇到回车键,写\0,字符串终止  
  78.             Flag_comm = 1;                   //接收命令完成,解析命令  
  79.         }  
  80.     }  
  81.     if(Flag == 1){       //接收到字符就打印,避免存在输入过快无法显示  
  82.         serial_print(SenData);  
  83.         Flag = 0;     
  84.     }  
  85. }  
  86. //0x0d = \r 0x0a = \n   0x08 = \b  


gejigeji521 发表于 2016-5-9 22:49 | 显示全部楼层
是在哪个里面实现的printf函数,是系统自带的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

100

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部