打印

一个问题:51单片机串口的问题

[复制链接]
2395|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyaosong|  楼主 | 2012-3-8 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想问一下:单片机串口在接收的时候是怎么接收的?如上位机一次发送一个字符串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
这就不明白了。
上位机发送的数据单片机每次应该只能收到一个字符,然后下一个字符会触发一个新的接收中断,如此经过多次中断处理后才能收到完整的内容,不知道我这么理解是否正确。请指点,谢谢

相关帖子

沙发
NE5532| | 2012-3-8 20:10 | 只看该作者
楼主在犯一个常见错误——在接收中断里面等发送,接收缓冲区溢出了咋办?

使用特权

评论回复
板凳
xuyaosong|  楼主 | 2012-3-8 20:36 | 只看该作者
确实如此,但是
RI=0; // 标志位清零

Temp=SBUF; // 读入缓冲区的值

P1=Temp; // 把值输出到 P1 口,用于观察

SBUF=Temp; // 把接收到的值再发回电脑端

while(!TI);

TI=0;

SBUF='o';
怎么就能全部收到11223344,而且最后能加一个字符o

使用特权

评论回复
地板
NE5532| | 2012-3-8 21:36 | 只看该作者
在错误的东西基础上研究如何错误没有任何意义,正确只有一种,错误有无数种。你实在要找是怎么错的,可能找得到,但是对解决问题意义不大,用来培养自己熟悉单片机还成。

使用特权

评论回复
5
xuyaosong|  楼主 | 2012-3-8 23:11 | 只看该作者
多谢大侠指点
经过调试,得到的结论是,确实不能在中断里面在做事了,做一些标记就够了

使用特权

评论回复
6
NE5532| | 2012-3-9 12:55 | 只看该作者
中断倒不是不能在里面做事,是看在做事的同时,外面还有没有事要做,如果没有,呆里面也没问题。具体问题具体分析,不能胡子眉毛一把抓。总的来说中断服务程序是尽量短。

使用特权

评论回复
7
xuyaosong|  楼主 | 2012-3-9 14:30 | 只看该作者
是的,对于串口的操作,常用的两种形式:异步双缓冲、即时处理。
前者利用FIFO队列,把处理放在中断外面;后者在中断里面处理。
需要根据任务需求来确定选择哪一种更合适。
对串口的内部机制正在进一步学习中

使用特权

评论回复
8
logokfu| | 2012-3-14 01:14 | 只看该作者
MARK一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:做个机器人,欧耶!提高专注力

45

主题

550

帖子

0

粉丝