打印

求救高手,串口中断总是引起程序复位??

[复制链接]
3517|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liaoyaohui|  楼主 | 2010-8-6 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我单独调串口能接也能发,一切正常,接上整个程序调试后就出现一接到数据就会程序重新开始,因为一开始有个显示子程序,一接到后就重新开始显示。但查了好久发现问题,程序中也没有再跳初始显示的程序。还请高手们帮帮忙,第一次碰到这种问题,脑袋快炸了。看了一些类似的**提到什么伪中断,堆栈溢出??不知是否

相关帖子

沙发
chunyang| | 2010-8-6 20:13 | 只看该作者
是你编程的问题,但你提供的信息不足以进行判断,重点查:1、是否开启了看门狗,如是,说明你没有正确的喂狗;2、中断及接收标志是否清零、是否存在中断重入问题;3、是否存在全局变量冲突;4、堆栈问题;5、逻辑错误……
出现这类问题,首先说明楼主的程序结构太混乱。

使用特权

评论回复
板凳
liaoyaohui|  楼主 | 2010-8-6 20:23 | 只看该作者
回复二楼:1.我并没有开启看门狗;2.标志位每次清零;3.进入串口中断后屏蔽所有中断,优先级高于定时器0中断,在定时器0中断中没有屏蔽所有中断;

使用特权

评论回复
地板
chunyang| | 2010-8-6 20:34 | 只看该作者
先不开启定时器中断进行调试。

使用特权

评论回复
5
liaoyaohui|  楼主 | 2010-8-6 20:38 | 只看该作者
下面贴上关键的一部分程序,望高手耐心指点,是用汇编写的:
ORG         0000H
AJMP        MAIN
ORG        0BH
AJMP        DSQ0
ORG        0023H
AJMP        UART_INT                                               
ORG        0030H
MAIN:
                CLR        RST
        ACALL        DELAY5                                                       
                SETB        RST
        ACALL        LCD_INIT              ;液晶显示程序
        CALL        CSH                       ;初始化程序
START:
                 ......
          JMP             START
/////////////////////////初始化///////////////////////////
CSH:
        MOV                SP,#50H                ;这里感觉有问题       
        MOV                TMOD,#00100001B
        MOV                TH0,#00H
        MOV                TL0,#00H
        MOV                SCON,#01010000B                                       
        MOV                PCON,#80H
        MOV                TL1,#0FAH
        MOV                TH1,#0FAH
        SETB        EA
        SETB        TR1
        SETB        ET0                               
        SETB        TR0                                          
        SETB        PS                               ;串口中断优先级最高
        SETB        ES
        RET
/////////////////////串口中断/////////////////////////////
UART_INT:
        CLR         EA                                                  
        PUSH        PSW                                                  //
        PUSH        ACC
        PUSH        DPL
        PUSH        DPH
        MOV        PSW,#08H                              ;切换寄存器1组
            。。。。。。。。。。。。。。。。         ;省略一部分
JIESHOU:       
        JNB                RI,$                 //去掉$
        CLR                RI
        MOV                @R1,SBUF
               INC                R1
        DJNZ                      R2,JIESHOU       
OUT:
        POP                DPH
        POP                DPL
        POP                ACC
        POP                PSW
        SETB        EA                                       
        RETI

使用特权

评论回复
6
liaoyaohui|  楼主 | 2010-8-6 20:43 | 只看该作者
定时器串口收发小程序都测试通过了,没问题,倒是初始化感觉有问题,一开始初始化在前面,上电后程序只显示一次液晶画面,但放到显示程序后面一开始显示两次后,再能进入程序,进入后程序正常(按键正常工作),但一收到数据就出问题了 ,液晶画面又重新显示,进入程序后按键又都正常,看是不是堆栈指针有问题
4# chunyang

使用特权

评论回复
7
lyjian| | 2010-8-6 22:14 | 只看该作者
CSH:
        MOV                SP,#50H                ;这里感觉有问题        
***************************
这样怎么返回?

使用特权

评论回复
8
maychang| | 2010-8-6 23:01 | 只看该作者
串口接收中断例程这样写,实在匪夷所思。


DJNZ                      R2,JIESHOU
这行看,事先已经根据需要接收字节数给R2赋值,接收到一字节向接收缓冲区存一字节,指针R1加一,但不退出中断,而是等待下一字节,直到全部接收完成。
倘若由于传输错误,丢了一帧,那串口接收中断就永不可能退出,其它程序不会得到执行。

另外,串口接收中断并没有使用ACC和DPTR,为什么压栈?

使用特权

评论回复
9
xiaoyu9632| | 2010-8-6 23:24 | 只看该作者
楼上说的好,楼主的程序问题就在这里,你的接收程序明显是在像一个有足够长度的buf中写入值,先假设你传输完全正确不发生错误,但是很显然你这样接收会花很多时间,所以一收数据就会出问题,等接收完毕后又正常显示。整个程序尚能做到模块化,但串口接收部分写的实在是不合理。中断中只应该每次产生中断进来接收完毕一个数据即退出进入主循环。这才叫中断嘛。

使用特权

评论回复
10
lyjian| | 2010-8-7 08:26 | 只看该作者
CALL        CSH                       ;初始化程序
这里调用CSH,返回地址压栈

START:
                 ......
          JMP             START
/////////////////////////初始化///////////////////////////
CSH:
        MOV                SP,#50H                ;这里感觉有问题
在CSH程序里又修改SP,CSH的返回地址丢失,RET指令后不知返回 到哪了。      

使用特权

评论回复
11
liaoyaohui|  楼主 | 2010-8-7 09:05 | 只看该作者
首先谢谢楼上各位的耐心指点! 我开始调试时用了两种方法,一是只接一个数据退出中断,二是接一串再退出中断(稳定性蛮好)。感觉都没问题就随便用了个, 接下来想问各位的是:
    1、在串口(接发)很繁忙的时候,一般用什么方法处理?首先肯定得判断头帧对不对(是不是每次接都得判断是否是头帧,不然像八楼说的要是丢失帧就不好确定长度),再开始接,后面最起码得判断自己定义的一串数据的长度吧(不知有什么好的办法)?是不是有个时间限制??
     2、另外本人愚钝,想把堆栈指针搞清楚,像十楼说的返回不知去了哪里?可我的为什么每次都成功返回到初始显示呢(这点很迷惑,应该是程序乱跑或跑死机啊?可都没有)?就是堆栈溢出也有很合理科学的解释吧?

使用特权

评论回复
12
xiaoyu9632| | 2010-8-9 09:32 | 只看该作者
本帖最后由 xiaoyu9632 于 2010-8-9 09:34 编辑

你的CSH调用没错,你的理解中有一个地方不对,你的串口中断只要负责接收数据即可,每次中断产生从sbuf中读取一个数据放入你的buf,中断只负责接收,而在中断外面进行对buf中数据的分析和处理。对buf设置一个头指针和尾指针,接收一个数据,头指针加一和尾指针进行判断,直到和尾指针指向同一个地址的时候表示buf接收满。而主循环中对buf的处理也是,每取走一个数据,也把头指针加一,和尾指针相等的时候就表示buf中数据被全部取走。当然你也可以直接在中断中做,但要注意设置不同的状态,根据你的数据帧协议,这样也不会占用中断太多时间,至少不会在中断中死等。

使用特权

评论回复
13
liaoyaohui|  楼主 | 2010-8-10 16:31 | 只看该作者
怎么没个高手指点迷津啊?  再补充下问题,当串口很忙碌时,就是串口在接收中或许又有新的数据发过来有没有什么好的方法避免冲突啊?(是新的覆盖旧的还是??)

使用特权

评论回复
14
g1234567| | 2010-8-10 17:39 | 只看该作者
好像是:
接收完成后没什么地方修改数据长度和存放位置,或者接收完成标志,0~256全部都可能会写吧,当然堆栈内的数据也将被修改了。
..........
DJNZ                      R2,JIESHOU
MOV   R2,    #length  
mov   r1,#adrr0
out:
   .....

使用特权

评论回复
15
928315| | 2010-8-10 19:27 | 只看该作者
申请一段缓冲区。将接受到的数据放入缓冲区。自己定协议。根据数据包头,数据长度,数据校验位等进行解包。如果数据错误,则要求数据重新传输。
串口没有那么脆弱。以前写个一个LED测试机的单片机,还有上位机程序,自己定协议。就是通过串口进行通讯。工厂经常一个月都不关机,都没有问题。怕数据传输出错。可以把波特率调低点。

使用特权

评论回复
16
liaoyaohui|  楼主 | 2010-8-11 16:39 | 只看该作者
问题早已解决,就是十楼所说的原因,十四楼的问题是因为我程序没有全部贴上来。接下来只是想向高手讨教下串口的一些冲突优化问题。比如我十一、十三楼提的问题,问题虽提的不是挺到位,但是高手可以讲讲自己在串口应用方面的一些心得体会以及值得注意的地方嘛!就当指导指导我们这些菜鸟们!!

使用特权

评论回复
17
liaoyaohui|  楼主 | 2010-8-17 20:48 | 只看该作者
21ic 沉贴就是快啊! 自己把它顶上去先!
   再重复下问题,假如按9楼说的只应该每次产生中断进来接收完毕一个数据即退出进入主循环。 那当串口很忙碌时,就是串口在接收中或许又有新的数据发过来有没有什么好的方法避免冲突啊?(是新的覆盖旧的还是??)

使用特权

评论回复
18
xiaoyu9632| | 2010-8-18 18:20 | 只看该作者
本帖最后由 xiaoyu9632 于 2010-8-18 18:22 编辑

你开辟一个空间,然后每接收一个数据,就将数据存到该空间,接着地址就加1.在中断里面你只负责接受而不进行处理。当然需要判断该空间是否已经被填满。然后在主循环中不断从该buf中取数据,当然所取数据按照你的协议进行组成你想要的数据。当然也需要判断该buf是否被取空。不知道这样说楼主可否明白?通常情况下其它主机给你发送数据当然不会一次只发一个,串口协议是属于异步通讯,双方必须设置相同的波特率,首先会检测一个start bit,确认后接收8bit的数据。这个时候数据被写入sbuf同时产生一个中断,你必须在很短的时间内取走sbuf中的数据不然就会被覆盖,所以在进入中断后不要执行太多的代码然后再取sbuf。当然你如果这样做也不用担心数据还没取走就产生新的中断了,因为作为一帧数据,它还包含停止位,然后还继续检测start,接收数据才会产生新的中断,你通过波特率计算一帧数据所用时间就知道了,如果发送数据的间隔大于你接收的数度,当然不行。其实时间还是很充裕的,完全用不着在中断中死等接收。

使用特权

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

本版积分规则

个人签名:听说21ic里面大虾多,我来学习学习。

18

主题

67

帖子

0

粉丝