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