单片机初学者,玩的是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;
}
}