想问一下:单片机串口在接收的时候是怎么接收的?如上位机一次发送一个字符串11223344,通过串口助手下发给单片机。用下面的程序
/******************************************************************/
/* 串口中断程序 */
/******************************************************************/
void UART_SER () interrupt 4
{
uchar Temp; // 定义临时变量
if(RI) // 判断是接收中断产生
{
RI=0; // 标志位清零
Temp=SBUF; // 读入缓冲区的值
P1=Temp; // 把值输出到 P1 口,用于观察
SBUF=Temp; // 把接收到的值再发回电脑端
}
if(TI) // 如果是发送标志位,清零
TI=0;
}
单片机能够把上位机的数据全部接收后原样传输回去
------------------------------------
我修改了一下程序:,把上面的判断改为
if(RI) // 判断是接收中断产生
{
RI=0; // 标志位清零
Temp=SBUF; // 读入缓冲区的值
P1=Temp; // 把值输出到 P1 口,用于观察
SBUF=Temp; // 把接收到的值再发回电脑端
while(!TI);
TI=0;
SBUF='o';
}
即想每次读入缓冲区内容后,送回上位机,然后再送回一个字母o,以此来判断单片机读入缓冲区内容的是每次读一个字节还是能够一次性都读完,运行结果为:
上位机发送11223344,单片机传回的是11223344o
看来单片机每次串口接收终端后,缓冲区中能把全部数据读入,但是SBUF只有一个字节,怎么会能够都读入进来呢?
-------------------------------------
把中断函数里面的内容继续修改为:
if(RI) // 判断是接收中断产生
{
RI=0; // 标志位清零
Temp=SBUF; // 读入缓冲区的值
P1=Temp; // 把值输出到 P1 口,用于观察
SBUF=Temp; // 把接收到的值再发回电脑端
while(!TI);
TI=0;
SBUF='o';
while(!TI);
TI=0;
}
运行结果为:
上位机用串口助手发送11223344,单片机收到后,传回串口助手,内容显示为1o1o2o3o4o
这就不明白了。
上位机发送的数据单片机每次应该只能收到一个字符,然后下一个字符会触发一个新的接收中断,如此经过多次中断处理后才能收到完整的内容,不知道我这么理解是否正确。请指点,谢谢 |