购物车0种商品
IC邮购网-IC电子元件采购商城
串口中断种添这两句话有什么用?
(2011/11/2 9:15:00)
这个帖子/viewthread.php?tid=40962&highlight=%E4%B8%B2%E5%8F%A3
    static void UartInterruptService(void) interrupt 4
    {
    ES = 0;
    RI = 0;
    uart_process(SBUF);
    ES=1;
    }
复制代码原帖说
为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。
真不知道什么干扰?

加入这两句话“ES = 0”“ES = 1”有什么用?

是不是对自己的程序不自信?还是惯性!??

我看除了如存在更高级别中断,啥种情况能形成干扰?

多谢

网友评论:看9楼的第一条。

网友评论:我觉得这再容易理解不过了,ES=0,ES=1,这就好比你正在做手头某个重要的事情,你先把你的手机调静音(就==ES=0)让他不要来打断你,当你做完了这个事关闭静音(==ES=1),因为或许你有重要的电话听不见,我觉得这没什么好说的,你却一直说错了,我的第一点就是这个意思

网友评论:ES = 1; 的功能是什么? 在串口中断里还有可能再进入串口中断吗?

网友评论:其实当我看了第一句话后就不愿再往下看了,关闭串口中断没什么用??,你去试试。你试试当你把串口收到的数据再发到电脑上来,你在发的程序里不要写ES=0,ES=1。我劝你去试试再说

网友评论:你怎么知道我没试过? 是不是回帖的人只有你一个人试验过?本来是你自己程序有问题,还非要关闭串口中断,你这样表面上是解决问题了,但在你关闭串口中断的时间内,就接收不到数据了,好好一个全双工串口被你给搞成半双工的了。

网友评论:你错就错这里,关了串口中断就收不到数据了。

网友评论:你看清楚了,楼主贴的程序,ES=1;是在串口中断里,在串口中断里写这句一点用都没有。据你的描述,你所谓的“把串口收到的数据再发到电脑上来”发送是在主程序里,而不是中断里。我跟你讲不明白,因为你满脑子都是错误观点。你慢慢悟吧,如果一周之内你还觉得自己是对的,那只能说明你不适合做这行。

网友评论:

首先要理解51只有2级中断,同级别再分优先位。
1.高优先级:
因为中断程序不执行RETI指令,即不放弃对高优先级的控制,即使优先级
排位较高的中断也无法嵌套中断。ES=0也无任何意义。
2.低优先级:
高优先级中断不会理会ES=X而会强行嵌套。
对于同级别中断,同时发生中断请求时才有“中断优先响应”问题。
当某中断响应进入中断后,它就是同级的“王道”~~~“王道就是霸道”
只有在它执行了RETI指令后其他高级或被挂起的同级中断才能按级别或优先位
再次争夺中断控制权~~~

参见:“中断隐身”

网友评论:
你错就错这里,关了串口中断就收不到数据了。
鲜为人知 发表于 2009-12-13 11:25
请问在你用查询方式发送数据的过程中,关闭串口中断还怎么接收数据?

网友评论:
我看错了问题,第二点确实没必要说。我不知道Ls的还有20L做没做过串口通讯,不要来了就扣顶错了的大帽子,如果错了就指出来。如果你只是天天看着书来说,我想说那你还没有真正了解这个东西。我这几天就在搞串口通讯 ...
鲜为人知 发表于 2009-12-13 10:46
51和STM32接收都一样的。对于发送,STM32比51多一种方式.

网友评论:
这个程序又不是教科书上的,难免有不成熟的地方。
按作者的意思,大概是担心在处理串口中断的过程中被其它中断所抢占。但关闭串口中断允许(ES=0)根本起不到保护这个中断不被抢占的作用。
其实如果怕串口中断被其 ...
desert_hawk 发表于 2009-12-11 22:12
你对51的中断体系不了解!

网友评论:
你对51的中断体系不了解!
李冬发 发表于 2009-12-13 13:54
没下文了? 请赐教一下?

网友评论:
你对51的中断体系不了解!
李冬发 发表于 2009-12-13 13:54
大侠咋理解的?say两句!?

网友评论:
你对51的中断体系不了解!
李冬发 发表于 2009-12-13 13:54
大侠咋理解的?say两句!?
xlsbz 发表于 2009-12-13 14:43
这位大侠除了说我不了解,别的什么也说不出来了。我只能说,我对这位大侠“心中”的51不太了解。

网友评论:
你看清楚了,楼主贴的程序,ES=1;是在串口中断里,在串口中断里写这句一点用都没有。据你的描述,你所谓的“把串口收到的数据再发到电脑上来”发送是在主程序里,而不是中断里。我跟你讲不明白,因为你满脑子都是错 ...
desert_hawk 发表于 2009-12-13 11:29
我觉得你不适合讨论技术,或许适合上街卖大白菜,当菜贩子。另外你在另一层问“如果用......发送,怎样接收,你可以查询接收”。

网友评论:
我觉得你不适合讨论技术,或许适合上街卖大白菜,当菜贩子。另外你在另一层问“如果用......发送,怎样接收,你可以查询接收”。
鲜为人知 发表于 2009-12-13 16:00
菜贩子比你混的好的有很多。。。。
我倒是很好奇,发送过程被接收中断所打断,是怎么导致你“发送的是乱数”的?查询接收可以用,中断接收却不可以用?

网友评论:
1.(假如你要将你接受到的数据通过串口发送)&&(没有关中断),那么可能你还没有发送完就又开始来了接收中断,那你发送的将是一串乱数据。所以要关闭中断,当你把已经通过串口接收的数据发送完后在允许中断。
2.当 ...
鲜为人知 发表于 2009-12-12 17:22
个人觉得,像这种水平还回帖,说的有鼻子有眼的,完全可以起到误导广大新人的作用。当然,回帖是每个人的权利和自由。

网友评论:
菜贩子比你混的好的有很多。。。。
我倒是很好奇,发送过程被接收中断所打断,是怎么导致你“发送的是乱数”的?查询接收可以用,中断接收却不可以用? ...
desert_hawk 发表于 2009-12-13 16:12
那是价值观的问题,不是混的好与坏的问题。
可能不止好奇这一点吧,我就不来回答你的问题了,我觉得这是个很简单的问题,但你却不这么认为,因为你说让我去研究一周,哈哈。那你慢慢研究吧,但不要说“你不适合搞什么”这之内的,因为你甚至根本不了解别人在做什么。除非那人什么都没做,才可能被你说中,但那就毫无意义了,好了吧,因为这是技术贴,讨论这些也没什么用,如果我错了,但只要不至于引导人走向犯罪 就没什么的

网友评论:
那是价值观的问题,不是混的好与坏的问题。
可能不止好奇这一点吧,我就不来回答你的问题了,我觉得这是个很简单的问题,但你却不这么认为,因为你说让我去研究一周,哈哈。那你慢慢研究吧,但不要说“你不适合搞什 ...
鲜为人知 发表于 2009-12-13 16:46
以你现在的发言,我真的很觉得你不适合做这一行。当然,只是个人看法。表达一下个人看法没什么问题吧。

网友评论:
1.(假如你要将你接受到的数据通过串口发送)&&(没有关中断),那么可能你还没有发送完就又开始来了接收中断,那你发送的将是一串乱数据。所以要关闭中断,当你把已经通过串口接收的数据发送完后在允许中断。
2.当 ...
鲜为人知 发表于 2009-12-12 17:22
我看错了问题,第二点确实没必要说。我不知道Ls的还有20L做没做过串口通讯,不要来了就扣顶错了的大帽子,如果错了就指出来。如果你只是天天看着书来说,我想说那你还没有真正了解这个东西。我这几天就在搞串口通讯 ...
鲜为人知 发表于 2009-12-13 10:46
顶一下。让更多的人看看这些“鲜为人知”的道理。看看号称搞“串口通讯网络”的牛人是怎么“真正了解”这么一个“很简单的问题”的。

网友评论:技术只占很小一部分!但是也是立身之本!

网友评论:倒塌,我竟然把ES看成EA了。
投降!

网友评论:俺答的没错呀~~~

网友评论:
俺答的没错呀~~~
hotpower 发表于 2009-12-14 04:28
问题是,某些“做过串口通讯”的“高手”是不会仔细看谁的回答的,唯一正确的是他自己心中的“实践经验”。

网友评论:好玩。谁都没说到正根上。

还有19楼第一条确实理解有误,“把接收来的数据再发送回去,......这时下一个接收数据中断又到了,......”你做的是RS485 ?如果是RS232全双工,发送—接收是两个独立的通道,不可能撞车的。否则是编程问题。做芯片的人都是绝顶聪明的人,不会设计那么差的硬件中断电路。

网友评论:再说LZ的问题,中断内部电路有一个“优先级激活触发器”一旦CPU响应某一中断,即将“优先级激活触发器”置位,以阻断同优先级和低优先级的所有中断。只有RETI指令能够清除“优先级激活触发器”,从而再次打开所有中断。

所以,当串口中断发生,CPU响应并进入中断之后,串口中断当然自动被阻断,即使你再次接收到多少数据,CPU在RETI结束之前都不会响应。

所以,在串口中断内,“ES=0/1“,纯粹是装聪明。设计芯片的人没那么笨,想不到这一点?

网友评论:

对19楼的第一条,还有一点:如果将接收缓冲器的数据搬移到发送缓冲器发送回去,进入发送缓冲器的数据将毫无阻碍地、不受任何干扰和控制地、由发送硬件时序电路发送出去,无论接收通道发生了什么事件、中断不中断,发送时序电路都会将缓冲器内的数据“义无反顾地”坚持发送完,并置位TI向CPU 告知“发送缓冲器空,可以输入下一发送数据”。至于CPU是否响应TI的请求,那是CPU的事情。它可以因为正在处理RI中断而对TI请求置之不理或者推后处理,因为RI显然应该紧急性更高。

所以,MOVSBUF,DATA; 之后,发送动作已经开始,谁想或者谁能够打乱、停止这个发送操作,可能“后悔莫及”。除非有人过于高明。

在那些成帧发送标准适配器中,例如:CAN,CSMA,HDLC,发送缓冲器一帧可能1,000字节之长连续发送,那里可以有CPU 半途废弃,终止发送的指令。玩过吗?

网友评论:呵呵,估计19楼的高手已经没有勇气再看这个帖子了。

网友评论:

52#

大侠很厉害!功力很深!
看看这个.........

执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
SBUF = 'd';
}
那么电脑能收到啥?

网友评论:
MOVSBUF,DATA; 之后,发送动作已经开始,谁想或者谁能够打乱、停止这个发送操作,可能“后悔莫及”。除非有人过于高明。

冷漠 发表于 2009-12-15 11:16
哈哈我想到一个办法!!
MOVSBUF,DATA0 ;//这条语句用波特率较低速度运行比如说300
这里赶紧变换成速度快的波特率啊,换的越利索越好
MOVSBUF,DATA1 ;// 以速度快的波特率运行这句

那么DATA1不能追上DATA0的后几位么?追上几位就干掉几位!

网友评论:停止发送是应该可以的,毕竟串口节拍需要一个定时器配合,所以让那定时器停止就可以了

网友评论:
哈哈我想到一个办法!!
MOVSBUF,DATA0 ;//这条语句用波特率较低速度运行比如说300
这里赶紧变换成速度快的波特率啊,换的越利索越好
MOVSBUF,DATA1 ;// 以速度快的波特率运行这句

那么DATA1不能追上DA ...
xlsbz 发表于 2009-12-15 12:10
嗨 晕头了!这种方法可行性可能只有一半吧!

网友评论:
停止发送是应该可以的,毕竟串口节拍需要一个定时器配合,所以让那定时器停止就可以了
5880527 发表于 2009-12-15 13:54
冷漠的意思是数据已经完全进入了移位寄存器了!

定时器已经管不着了

网友评论:没啥用,没这两句话,中断返回前也不会进入新的串口中断。

网友评论:58#
数据进入移位寄存器了也应该是受定时器管的,旁边没人吹口哨喊121了它也不走了

网友评论:60#

很抱歉,你的认识是错误的!

网友评论:有意思。一口米饭的吞咽动作已经完成,下咽到胃的结果好像已经不可控了。如何让米饭不进入胃里而半途终止?

有人想了个办法:那还不好办,我给他心脏一枪,让他生命即刻中止不就完啦?聪明!可惜,难怪咱们设计不出芯片。别人是在数据流的发送器出口上设计闸门硬件,咱们是在数据流的尾巴拽住它。东、西方思维的差别,连打鬼子都是“到敌人后方去,...”

还有个疑问:这两种做法的最终后果是什么?
1、关闭发送器,经过恰当时间,再次打开时,发送缓冲器必为空。
2、停止发送时钟,经过恰当时间再次开放时钟时,发送缓冲器遗留的数据,将再次被驱动发到接收方,接收方对不完整残帧数据是会有动作的,并且会产生异常中断要求CPU来处理的。这恐怕不是发送端程序员的初衷吧。“多做之过。”

设计芯片的人早就设想到了第2种方法可能的后果,他不会连这点后果都考虑不到吧。——你给对方接收方(适配器)造成了什么;对方的适配器硬件如何设计处理你的发送异常。
再有一点,由于成帧发送标准都是由适配器采用同步技术按比特流发送的,所以芯片设计的关闭发送器电路是精确关闭点的;例如:它不会在停止域关闭发送器,即使这时你已经程控发出了异常停止发送指令。

呵呵,那么咱们想到的通过停止发送时钟的方法能够精确关闭点吗?在停止位那一点突然停止了时钟,这一帧白干啦?

再有没想到的一点,....唉,想不到的技术还多呢。同步通信技术是怎么回事还没搞清楚呢。咱们慢慢学吧。
也许还有什么更多的我们没想到的东西?落后的差距就源于“不是做不到,而是想不到。”

网友评论:正好刚看完一篇报道《中国军人不生疏》。意为现代战争,不怕敌强我弱,最怕对方采用的高科技武器咱们没见过,不知道性能厉害。

想当年中越反击战,小小的越南竟然能够以20:1 的弱势兵力和中国对抗。结果不但有绝对的空中优势,地面也是占尽便宜。全是美国最新武器,中国军人不但没见过,想都想不到。20个中国军人一次只能仍一颗手榴弹,扔不到50米?美国的掷弹筒百米开外,一个人一次发射一片。距离够不着对手,干挨打。最后的伤亡人数恐怕远不止20:1 了。

所以,什么事多想想可能还有什么想不到的。否则别人35,000米高空施展打击,束手无策干挨打了。

网友评论:大侠高论啊!深奥!

网友评论:
52#

大侠很厉害!功力很深!
看看这个.........

执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
}
那么电脑能收到啥?
--------------------------
执行下面的语句(单片机与电脑连接)
while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
SBUF = 'd';
}
那么电脑能收到啥?


xlsbz 发表于 2009-12-15 12:00
这个程序是我刚学单片机的串口时弄的。
也是我发现的第一个keil软件仿真不正确的程序。

最后的硬件运行结果是
SBUF = 'a';
则 上位机 收到的数据是
61 61 61 。。。。。。。。。



SBUF = 'a';
SBUF = 'b';

则上位机收到的数据是
61 62 62
61 62 62
61 62 62
.......


SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
则上位机收到的数据是
63 62 61 63
63 62 61 63
63 62 61 63
63 62 61 63
63 62 61 63


用 SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
SBUF = 'd';
则上位机收到的数据是
全部都是 61
可以看到无论什么情况,第一个发送的字符a总有机会发送成功。

有一点是肯定的:就是字符完全进入移位寄存器后,是以波特率的速度发送的。

另外这两点也可能是对的:(1)字符完全移到移位寄存器外面后,其他字符才会进入到移位寄存器。(2)缓冲器的字符进入到移位寄存器是按照并行方式进入的,就是说是几乎不花时间的。

网友评论:好题目。只是你没有得到确定的结果。这个实验换了我做,肯定会得到另一个结果。——说不清结论啦。

其实都是让中国教授写的书害的。刚看了一本美国教授写的《8051微控制器和嵌入式系统》,同样也是RI/TI 的讲述,几句话就让人——让咱们中国的8051学习者茅塞顿开。怎么中国的教授写的书就那么草根呢,连LS提出的几个问题都讲不清楚,20多年了,国人教授写的8051教材比草还多了,有一本讲清楚LS的问题了吗?(待续)

网友评论:66#

多谢 推荐《8051微控制器和嵌入式系统》,

请问有PDF版本的《8051微控制器和嵌入式系统》么?我在网上没有找到

网友评论:我是在互动出版网上买的。还有1、2本美国人写的关于8051控制器,发现别人写的就是不一样。首先讲述的是设计原理而不是使用方法。

所以,根据设计原理,你的实验结果根本不用做实验就知道结论了。——肯定是它。除非你变换了标准程序写法。

网友评论:68#



我一直想找一本讲多讲原理少讲例子的书
《8051微控制器和嵌入式系统》的PDF版我再找找看

推荐一本书《代码大全》 绝对好书。 我闲着没事就看!

网友评论:61#
呆会我去验证一下,我总觉得它发送了半截后定时器重装值改变了波特率也就会改变,而关闭那定时器发送也就终止了

网友评论:麻烦LS 顺便做一下:发送半截,令TI=1;看看能否中止发送。这才是中外8051教材里讲述的理论上的重要差别。也是中外教授头脑思维的差别。可以引发出很多设计原理,写一篇前人不曾写过的硕士级别的论文。

像LS提出的2种方法无疑是肯定可行的,——人为破坏波特率的稳定条件,但是“有用”吗?能证明什么理论问题?

UART的时钟在具体应用中应该视为固定不变的稳定波特率,可编程的内部时钟一旦初始化设置,显然希望像固定振荡源一样稳定可靠。——结果2个方法都不能用了。我们只能从这些方面考虑问题?

网友评论:我和楼主xlsbz的方法都是有点钻牛角尖了冷漠的观点是别人设计单片机硬件时已经保证了串口的足够可靠,这是正确的。
刚才试了一下,我的观点是正确的,在数据送到SBUF后延时一段时间在数据还没完全移位完成之前关闭定时器是能阻止数据的后面几位移出的

网友评论:书本上有这样一段“方式1和方式3的波特率可变,由定时器T1的溢出率决定”,所以停止定时器自然就没了节拍信号

网友评论:做这样的实验显然不能用循环发送,应该只发送一次。像这样:
// while (1) {
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
while(1);
//}

还有:下面的写法,将得到不同的结果。(只有从不同的结果中才能发现更多的东西。)
while (1) {
TI=1; // 关闭发送中断条件下
SBUF = 'a';
SBUF = 'b';
SBUF = 'c';
TI=0;
while(1);
}

这正是中外教授的不同。中国的51教材上写的是“TI=1表示发送器空;通知CPU可以送入下一数据。”“TI必须软件清除为0。”

哈!为什么要软件清除?TI=0应该表示发送器不空(满),那么为什么硬件设计上不利用以发送器SBUF为目标的写脉冲(MOVSBUF, #DATA )自动清零TI,而要把这个完全可以自动实现的操作留给用户来软件控制实施?——谁都清楚:中外教材上写的很清楚:是MOVSBUF, #DATA 指令(写脉冲)启动了发送控制器发送开始。那么它同时自动清零TI不是很合理的设计吗?为何留给用户操作?(这里没考虑清除中断的作用。)
这就是中国教材上20年没有讲清楚的地方。

所以,可以展开想象:软件CLR TI; 是有控制作用的。而不仅仅是复位中断申请信号。
SETB TI ; //关中断条件下
MOVSBUF,#DATA;
会发生什么?

网友评论:楼上做的这个研究有点意思,以前还真没做过类似试验,现在手头也没有51的板子,没法试了,胡乱猜测一下:看了下51的串口内部结构图,发送似乎是单缓冲,即发送SBUF即是缓冲器又是移位寄存器,所以在启动一次发送后,单片机会有一种“保护机制”保护当前正在发送的SBUF内的数据不被改写,在此期间“写SBUF”的操作是不起作用的,直到发送完成后,TI置位,用户软件对TI进行清除后,才撤销了这种保护机制,所以“TI = 0;”的作用,一是清除中断标志,二有可能就是撤销这种保护机制了。猜的,如果不对,请别拍砖,呵呵。

网友评论:浮云 都是浮云啊.........

浏览:(3144)| 评论( 0 )
博文评论

  • 昵 称:
  • 内 容:10~250个字符
  • 验证码: 验证码看不清楚?请点击刷新验证码
  •                      
  • 博文分类

    热点博文

    最新博文

    最新评论

    IC电子元件查询
    IC邮购网电子元件品质保障