以下是我写的串口接收数据后立即回发的代码
SERIAL:
JBC RI,RECEIVE;检查是否是接收数据中断
CLR TI
AJMP SRET
RECEIVE:;若接收到数据则立即回发。
MOV BUFFER,SBUF
MOV SBUF,BUFFER
SRET:INC R1;计算中断次数
RETI
我想问一下,如果接收到数据的话执行MOV SBUF,BUFFER会发生发送数据的中断么?是什么样的过程?是不是接收到数据-》接收数据中断-》发送数据-》发送数据中断-》发送数据中断退出-》接收数据中断退出?我通过记录R1的值发现传输一个字符是会有两次中断的。谢谢。
串口发送/接收会有一个并串行/串并行转化的过程, 如果接收和发送中断使能, 那么发送缓冲区空或接收缓冲区满分别会产生发送中断和接收中端。
其实我觉得你说的情况是可能发生的,但至少要满足条件:1)芯片要工作在全双工模式,2)支持中断嵌套,3)发送的中断优先级高于接收的中断优先级。
但是我认为在接收中断里发送数据不是很好的思路。
谢谢!我现在使用的是51芯片,串行口中断应该不分发送和接收优先级的。同级中断不应该嵌套,但是我的确得到了我所要的结果,所以我很费解。
我修改程序
SERIAL:
JB RI,RECEIVE;检查是否是接收数据中断
CLR TI
AJMP SRET
RECEIVE:;若接收到数据则立即回发。
MOV BUFFER,SBUF
MOV SBUF,BUFFER
CLR RI;清除接收中断标志
SRET:INC R1;计算中断次数
RETI
如果按照循环嵌套的说法,这样应该会进入一个死循环,因为RI一直没办法被清零。但是程序却还是能够正常收发,我的想法对么?一般来说如果要把收到的数据立即转发会怎么做?
按你修改后的程序,如果接收到一个数据,会产生一次中断,进入你写的中断服务程序
经JB RI,RECEIVE判断为接收中断,跳转执行MOV BUFFER,SBUF ;MOV SBUF,BUFFER 这里没问题,因为51里发送的SBUF与接收的SBUF只是地址相同,实际上是独立的空间,但是此时不产生发送中断。然后继续执行CLR RI; 再SRET:INC R1会产生一次记数,
过了一段时间(发送一字节所需时间,与波特率有关),之前执行MOV SBUF,BUFFER 送完数据后会再产生一次发送中断,导R1又记了一次数,所以是R1总共产生两次记数
另外,如果没有清RI肯定是不行的,会造成执行完一次中断服务程序跳出后又再次进入。
楼主为啥觉得同级中断不应该嵌套?很多单片机都支持中断嵌套的,也包括同级中断的嵌套
我明白了,发送数据的中断是在发送完以后产生的,而就收数据的中断是在发现串口上有数据就产生的,所以这里面有一个时间差,所以能够正常执行CLR RI,如果我在这一句语句前加上一点点的延时,程序就会有问题了对吧。
在51里面同级中断就是不允许嵌套的,其他的cpu我不知道哦。