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