打印

单片机和上位机通讯的软件复位问题

[复制链接]
8473|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风语者1979|  楼主 | 2008-4-17 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dld2| | 2008-4-17 09:49 | 只看该作者

首先要搞清楚是物理层无法通讯还是协议问题

比如串口,是根本没有中断;还是通讯协议上没有重新连接的机制。

使用特权

评论回复
板凳
风语者1979|  楼主 | 2008-4-17 10:28 | 只看该作者

有中断的

我正常测试没有任何问题,所以中断是对的。我只是觉得奇怪,为什么非法断电之后再来电就不能通讯了?难道是硬件复位本身的问题?

使用特权

评论回复
地板
dld2| | 2008-4-17 10:48 | 只看该作者

是啊,硬件复位是否正常。

使用特权

评论回复
5
风语者1979|  楼主 | 2008-4-17 11:00 | 只看该作者

看门狗有没有问题呢?

我本身只用了一个阻容复位,没有看门狗,是不是这里的原因呢?

使用特权

评论回复
6
dld2| | 2008-4-17 11:11 | 只看该作者

和看门狗无关

在验证硬件和软件的正确性时,应该没有看门狗。

使用特权

评论回复
7
风语者1979|  楼主 | 2008-4-17 11:33 | 只看该作者

不是验证硬件和软件的正确性

我现在的问题是测试单片机的复位问题

使用特权

评论回复
8
wxj1952| | 2008-4-17 11:37 | 只看该作者

上、下位机之间缺少握手协议

也许上位机上电时有和下位机的握手协议,联机后就以下位机一直正常为条件,没有加入“下位机掉电事件、重新上电”这种状态的协议内容。仅只检测了下位机不正常状态,.....

加入下位机申请联机协议:任何时候都应该是下位机首先发出握手申请信号,.....这样,当下位机重新上电时,首先向上位机发出的应该是“重新连接申请”...上位机收到后,与下位机重新握手联机。....就像回到开机时初始状态。

使用特权

评论回复
9
风语者1979|  楼主 | 2008-4-17 12:27 | 只看该作者

请教楼上的wxj1952

其实断电以后再来电,我发现单片机程序不跑了,是不是说用握手协议也可以搞定呢?个人觉得,握手协议有动作之前单片机程序首先要跑吧,但单片机不跑了不是表示握手协议没用了?而且来电之后通讯不行,但我只要把PCB板上的电源拔下再插上就OK了!

使用特权

评论回复
10
风语者1979|  楼主 | 2008-4-17 14:28 | 只看该作者

我用do...while语句加了握手协议的程序,对不对?

#include<reg51.h>
unsigned char inbuf[10];
unsigned char incnt;
void init(void)
{
 TMOD=0x20;
 TR1=1;
 TH1=0xfd;
 SCON=0x50;
 IE=0x90;
 ES=1;
 EA=1;
 P1=0xff;
}
void SendStatus(unsigned char St)
{
    EA=0;
    SBUF=0xeb;
    while(!TI);
    TI=0;
    SBUF=0x90;
    while(!TI);
    TI=0;
    SBUF=0xeb;
    while(!TI);
    TI=0;
    SBUF=0x90;
    while(!TI);
    TI=0;
    SBUF=St;
    while(!TI);
    TI=0;
    EA=1;
}

void main(void)
{
    unsigned char KeyStatus,KeyTem;
    incnt=0;
    init();
    do
     {
       SBUF=0xaa;
       while(!TI);
       TI=0;
       }while((inbuf[0]&&0xbb)!=0xbb);
    while(1)
    {
        KeyTem=P1;
        if(KeyTem&0xf0==0x70)
          {
            KeyStatus=0x70;
          }
        else
           {
             KeyTem=KeyTem&0xf0;
             KeyStatus=KeyTem;
             } 

            //check uart
        if(incnt>=5)
        {
            incnt=0;
                 if((inbuf[0]==0xeb)&&(inbuf[1]==0x90)&&(inbuf[2]==0xeb)&&(inbuf[3]==0x90)&&(inbuf[4]==0x55))
                SendStatus(KeyStatus);
            if((inbuf[0]==0xeb)&&(inbuf[1]==0x90)&&(inbuf[2]==0xeb)&&(inbuf[3]==0x90)&&(inbuf[4]==0x66))
                SendStatus(0x77);
        }
    }
}
void irq_uart(void) interrupt 4
{
    if(RI)
    {
        RI=0;
        inbuf[incnt++]=SBUF;
    }
    if(TI)
        TI=0;
}

使用特权

评论回复
11
dld2| | 2008-4-17 14:34 | 只看该作者

呵呵,当然应该去改硬件

单片机不跑软件有什么用呢

使用特权

评论回复
12
zjh006| | 2008-4-17 14:38 | 只看该作者

单片机程序不跑了?

是死机了还是进入死循环了?
赞同8楼观点。

使用特权

评论回复
13
风语者1979|  楼主 | 2008-4-17 14:53 | 只看该作者

我刚才发现新问题

我刚才发现,如果我不给PCB板断电,而是只给PC机断电,之后再通讯也不行,这是不是说明了就是握手协议的问题?

使用特权

评论回复
14
风语者1979|  楼主 | 2008-4-17 15:05 | 只看该作者

请大家帮忙看看我上面发的程序

上面我发了通讯程序,增加了握手协议,就是主程序里面的do...while...语句,如果真是缺少握手协议,那么我这样加程序可以么?

使用特权

评论回复
15
gxy_xixi| | 2008-4-17 16:56 | 只看该作者

我觉得判断TI那有问题

我觉得判断TI那有问题,本来是等待TI置1,但如果中断里提前修改了,就会进死循环了吧,呵呵,不知道说的对不对。

使用特权

评论回复
16
wxj1952| | 2008-4-17 18:51 | 只看该作者

电源上电缓慢

如果真的发现重新来电(220V交流)后,单片机程序不跑了,那是复位电路问题!因为单片机5V电源复位有上升率变化要求,不能太缓慢。(所以你重插“稳态”电源可以使单片机复位——上升率满足了要求。)单片机电源是特殊专用的,不是0—5V缓慢上升的。

握手协议:模拟打电话过程。
1、当然是等待上位机先发来查询帧;
2、要求联机的被查询下位机发出握手请求;
3、上位机发出响应,握手成功。

断电、重上电后当然又从1、开始。

所有步骤都是停—等协议。超时另处理。

使用特权

评论回复
17
风语者1979|  楼主 | 2008-4-17 20:16 | 只看该作者

wxj1952,我排除了复位和上电缓慢的问题

我测试的时候,特意把PC机非法关机,但PCB板也就是单片机上的电源没有断掉,结果发现,一样不能通讯,但只要把PCB板上的电源拔掉再插上,就OK!我现在都困惑得很!

使用特权

评论回复
18
风语者1979|  楼主 | 2008-4-18 08:46 | 只看该作者

大家帮帮忙啊,急!

 

使用特权

评论回复
19
农民讲习所| | 2008-4-18 10:12 | 只看该作者

软件协议解析错误

大概是使用数组代替队列的后遗症的结果,在发送错误后不能正确定位包头。

使用特权

评论回复
20
wxj1952| | 2008-4-18 14:22 | 只看该作者

回17楼

这是很容易理解的。
你把电源重新插拔一下。相当于下位机按了一下复位按钮(一切复位从0000H重新执行起,当然正常。)

问题在于当通信中断时(由于断电等原因)下位机/上位机程序正在轨道的中间哪个位置循环,它们都缺少这样一种协议程序,即:超时异常处理协议。

应该是:无论通信哪一方,在停等协议超时的情况下(通信方不可能永久等下去,它需要设置一个超时等待时间Tout。)在Tout内如果没有收到对方的预计响应,即认为故障断线(可以规定重发3遍)。

电话断了线,当然只好重拨/重新握手协议联机了。而你这种联机协议好像只在上电时运行了一次,以后就没有了。

停-等协议,可以找一下《计算机网络》的书。推荐一本通俗教材《计算机通信技术》潘新民主编,电子工业出版社。关于通信建立前的呼叫,清除呼叫...

使用特权

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

本版积分规则

29

主题

58

帖子

0

粉丝