STC15单片机串口按行接收字符串(中断函数略长~求破解)

单片机初学者,玩的是STC15系列的IAP15F2K60S2。因为串口数据传输需要,写了个按行读取字符串的串口中断函数。采用了换行符和超时双重判断机制,每行读取前16(BUFLEN)个字符。每接收一个完整行,置1判断位将命令发给主函数。
经过测试,效果已经稳定。美中不足是中断函数里写的代码有点长,有20行左右。这样是不是会影响结果和性能呢。还有没有别的方法?

void timer0() interrupt TIMER0_VECTOR
	
{
	TR0=0;
	if(recv_index>0){
		
			if(recv_index<BUFLEN-1){
				recv_str[recv_index]=last_buf;
				recv_index++;
			
}
	  	if(recv_index<BUFLEN){
	  	 	recv_str[recv_index]=0;
		 	strcpy(cmd_str,recv_str);
			get_line = 1;
		 
	 	 }else{
			 recv_str[BUFLEN-1]=0;
	 	 }
	}
	last_buf=0;	
	recv_index=0;			
}

void UART1_int (void) interrupt UART1_VECTOR
{
	//u8 last_index;
	TR0 = 0;
	if(RI)
	{
		RI = 0;
		recv_buf = SBUF;
		if(recv_buf == '\n' && last_buf=='\r'){
		  if(recv_index < BUFLEN){
			recv_str[recv_index]=0;
			strcpy(cmd_str,recv_str);
			get_line = 1;
		  }else{
			recv_str[BUFLEN-1]=0;
		  }
		  last_buf=0;
		  recv_index = 0;

		}else{
		  if(recv_index < BUFLEN){
			if(last_buf != 0){
				recv_str[recv_index]=last_buf;
				recv_index++;
			}
		  }
		  last_buf=recv_buf;
		  setTimer0();
		  TR0 = 1;
		}
		COM1.B_RX_OK = 0;
	}

	if(TI)
	{
		TI = 0;
		COM1.B_TX_busy = 0;
	}
}

生命科学过去式

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值