打印

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

[复制链接]
楼主: 风语者1979
手机看帖
扫描二维码
随时随地手机跟帖
21
2shift| | 2008-4-18 14:28 | 只看该作者 回帖奖励 |倒序浏览

可能是你的程序存在一些缺陷

单片机只有接收到正确的数据包后才作响应,如果不正确,丢掉重新接受数据包。上位机发下数据包,如果在一段时间之内没有收到正确的下位机的响应返回,做一些容错处理之类的代码。这样,就不会存在你说的问题了。现在的工业组态软件都是这种处理机制,很好用的。

使用特权

评论回复
22
emailli| | 2008-4-18 15:33 | 只看该作者

架构不好!

你这样的程序架构。想不出问题都难!

建议再看看 程序的架构怎么编写吧。

使用特权

评论回复
23
xhtxzxw| | 2008-4-24 16:38 | 只看该作者

嘿嘿

差不多可以肯定是你的PC机程序写的比较臭!51这边当然也有问题。

你所说的非法断电,是指的整个220V交流没电了吧?于是PC没电了,51也没电了!

然后再来电了,你的51马上就起来了,开始握手了!
可PC搞不好得好几分钟才起来接着你才能运行那个程序。
这个时候51这边已经不耐烦了,握手没有成功。

你试试:
先开51,后启动PC上的程序,行否? 不行?
先启动PC上的程序,后开51,行否? 行?

使用特权

评论回复
24
fsaok| | 2008-4-24 16:50 | 只看该作者

简单看了一下楼主的程序

不明白初始化部分,最后那句,

while((inbuf[0]&&0xbb)!=0xbb);

不明白inbuf[0] && 0xbb 为什么最后会等于 0xbb

使用特权

评论回复
25
2008wawavu| | 2008-4-24 22:51 | 只看该作者

我是新手,以后还请大家多多指教.

我是新手,以后还请大家多多指教.http://www.et-dz.com
相关链接:http://www.et-dz.com

使用特权

评论回复
26
mapleyang| | 2008-4-25 11:57 | 只看该作者

程序写的不行

没有超时机制,建议找一下常用的串口接收程序看看,最好采用状态机的方法

使用特权

评论回复
27
5880527| | 2008-4-25 17:30 | 只看该作者

一个系统的通讯出错了不能使单片机也死掉呀

否则这样的控制太恐怖了

使用特权

评论回复
28
甄蔡组合| | 2008-4-26 10:52 | 只看该作者

学习中

使用特权

评论回复
29
dai_weis| | 2008-4-26 12:30 | 只看该作者

要是51先于PC开始向PC发送数据

可能引起PC的操作系统误认为是一个鼠标设备
需要PC端软件运行后,发送指令使51再向PC发送数据

使用特权

评论回复
30
king6301| | 2008-4-26 15:18 | 只看该作者

aree with 19th

   超时无接收,接收寄存器溢出无处理,缓冲数组无清零

使用特权

评论回复
31
狂崽| | 2008-4-26 17:07 | 只看该作者

在断电时,你的程序正在等待TI=1,

在断电时,你的程序正在等待TI=1,在此你把EA=0,不会响应接收中断,既PC机发送不成功,
不知你的断电到来电时间有多长,如果短的话,再看你电路板上电容蓄电时间多久,也许从你断电到来电瞬间,你的电源还不是0,电容有电,单片机没有复位,任然处在发送等待状态,当然可能出现PC发送不成功,你的DO---while那根本就没执行,你看起来就和单片机没工作一样,其实他在发送等待TI=0呢,你拔电后插电,时间应该够电容放电了吧,单片机正常复位,上电正常工作。
检测对不对方法
接收不要用中断,做一个定时中断,他就是定时查询串口接收工作,同时吧你那发送那EA=0和EA=1去掉,再按照你说的那样断电,然后PC发送,看看是否发送成功,

这是我的猜测,对不对你测试就知道了

使用特权

评论回复
32
学无涯| | 2008-4-27 20:59 | 只看该作者

问题严重

while((inbuf[0]&&0xbb)!=0xbb);

当inbuf[0]为0:0 != 0xbb;
当inbuf[0]不为0:1 != 0xbb;
永远死循环

使用特权

评论回复
33
狂崽| | 2008-4-27 23:45 | 只看该作者

问题

 do
     {
       SBUF=0xaa;
       while(!TI);
       TI=0;
       }while((inbuf[0]&&0xbb)!=0xbb);
应该是
 do
     {
       SBUF=0xaa;
       while(!TI);
       TI=0;
       }while(inbuf[0]!=0xbb);吧,
你想发送aa后,PC返回bb握手吧,
你可以在你复位电容那并个按置开关,当非法关机后,从起正常后在按一下按置复位,应该就不会出现那问题了

使用特权

评论回复
34
xiaoyuan_ly| | 2008-4-28 13:11 | 只看该作者

我来说几句!!!!

    其实,形成这样的问题是你对可能出现的情况没有足够的认识清楚或预见,变成了能用但并不可靠的情况出现。
    从你上面的回答,我是不是可以这么理解:
1、单片机的复位没有问题。
2、你的通讯好用都是建立在一次完整的通讯完成之后的。

   这样的话,
   一、你是否有考虑当一次通讯没有正常的完成情况下的处理吗?!(包括信道上的干扰、非法断电等等)。
   二、应在调试时坚决不用所谓的看门狗,也就是说没有看门狗,你也可正常可靠工作。用看门狗只是让工作更加可靠罢了。
   三、应设置主机与从机之间的双向通讯软复位命令,以保证之间的通讯程序流程任一点位置彻底可控。
   四、最好加上信道编码,以提高在有干扰或很大干扰情况下通讯的传输有效率和通讯处理速度。
   

使用特权

评论回复
35
yli57678| | 2008-4-28 16:38 | 只看该作者

我也有类似的问题

我觉得是握手协议的问题,虽然下位机断电但下位机一直送数据,PC再次上电他没有检测到下位机的信号,那么你应该确定 上位机程序从什么地方开始执行

使用特权

评论回复
36
sharks| | 2008-5-3 12:54 | 只看该作者

我觉得大家都跑题了!

   首先是楼主的第一贴就把大家引跑题了。楼主的本意应该是带电复位,导致单片机的通讯中断,程序能自己恢复。但是断电再上电就不行了,应该是这个意思吧?所以主要问题不是啥握手之类的问题,而是断电再上电单片机程序根本没跑!

   这是个很常见的问题。楼主首先应该告诉大家用的是啥单片机。很多带有SVS的单片机(如MSP430的1系列),电源电压不低于某个值不能产生正确的复位,其他很多单片机也有这情况。你电路板通过串口连着PC机,PC机的232接口信号的电压(BIT0= +10V)通过单片机IO泄放二极管给VCC供电,使VCC降不到0V。这是复位失败的主要原因。
   
   解决办法有很多,最简单是用复位芯片,让电压不符合要求时都一直复位。再有就是在VCC和GND之间接一个小电阻,如100欧,在断电后让VCC电压迅速降下来,当然,串口PCTXD上串个数K电阻更好。


   

使用特权

评论回复
37
hq_y| | 2008-5-3 12:57 | 只看该作者

先编写一些简单的测试程序吧,看看单片机是否还在工作

比如,在主流程中对某个I/O不断取反;
在串口中断中,对某个I/O不断取反;

使用特权

评论回复
38
ldy216| | 2008-5-4 09:33 | 只看该作者

有什么就问我大师

   看样子你那上下位机都有问题,典型的线型逻辑造成的。
  协议是最大问题,其次你的硬件设计可能不太好。
   关于设备与上位机之间,应该是实时握手的,有事务信息就收发事务信息,没有平时就发握手信息。当上位机连续发送2条以上消息不回答时,认为下位机已经离线。

使用特权

评论回复
39
dld2| | 2008-5-4 09:35 | 只看该作者

制订通讯协议是典型的设计工作

使用特权

评论回复
40
2008wawavu| | 2008-5-6 17:27 | 只看该作者

我测试的时候

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

使用特权

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

本版积分规则