我的电脑下面连了两个自已开发的单片机,上面接有热敏电阻。它们的功能是,我从上位机发查询指令,他们取得温度后返回结果回来。一块编号为001,一块编号为002,485串联起来的。我上位机的程序用vb写的,控件用的mscomm。问题如下,我用轮询不停的查询两个板子的温度,他们都能回结果来。但是如果002不小心断电了。我查001正常的,再查002会没有响应,反过来再查001的时候,就也没有响应了。我得把001和002都断电,才能正常的查.也就是说如果查了不存在的板子,再查存在的板子也会没有响应了。如果当出现这种情况的时候,我用网上下的调试工具,直接发指令到001,第一次命令也没有响应,再查一次001就正常了。我用我的软件也能查了。不需要给板子断电重开。说明板子设计上没有问题。为什么我的软件查了不存在的板子再查存在的板子也没有响应。而且用网上下的调试工具再查存在的板子第一次命令也没有响应,要再查一次才正常。问题出在哪里的?我的什么缓冲这些也清空了的,比如我的软件查001没反应的时候,关了软件再开也没有响应,而且怪在我用网上下的调试工具可以查,二且必须是第二个命令才有响应。或者继续用我的软件的话,得把001断电重开才有响应。板子没有问题,如果有问题,调试工具也会查不了。
这样的问题会出在哪里呢?麻烦高手们帮帮忙啊

解决方案 »

  1.   

    会不会是用了什么on error resume next ,Doevents造成的!
      

  2.   

    如果你真的可以保证你的板子没有问题的话,那么就是你处理轮询的方式有问题,主要出现在你的在连续通讯时出错的错误处理代码上面,造成一旦出错就会中止查询。解决的方法很多,例如你可以用定时器做一个看门狗程序,一旦程序中断,则重新复位mscomm,重新进行通讯,或者发现有某个设备中断,则报警,并舍弃这个设备之类……具体问题具体分析。
      

  3.   

    1)建议改变上位机主动查询方式为被动局面接收数据方式,将单片机组成交替发回数据,以不同地址号区别,且在上位机的接收代码中以地址号来处理接收数据.
    接收代码模块做成在单独窗体内,同时按一定时间间隔由其它主程序将接收代码模块窗体卸载,然后由其它主程序自动加载.
    2)而且应该在下位机命令前后加标识符并固定命令字长,这样可在接收代码中对标识符和字长判断,符合要求进入数据处理.
    3)对MSComm控件的属性RThreshold按命令字长设置,希望是同一字长,这可避免很多麻烦.